pledge.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/StringView.h>
  7. #include <Kernel/Process.h>
  8. namespace Kernel {
  9. KResultOr<FlatPtr> Process::sys$pledge(Userspace<const Syscall::SC_pledge_params*> user_params)
  10. {
  11. Syscall::SC_pledge_params params;
  12. if (!copy_from_user(&params, user_params))
  13. return EFAULT;
  14. if (params.promises.length > 1024 || params.execpromises.length > 1024)
  15. return E2BIG;
  16. String promises;
  17. if (params.promises.characters) {
  18. promises = copy_string_from_user(params.promises);
  19. if (promises.is_null())
  20. return EFAULT;
  21. }
  22. String execpromises;
  23. if (params.execpromises.characters) {
  24. execpromises = copy_string_from_user(params.execpromises);
  25. if (execpromises.is_null())
  26. return EFAULT;
  27. }
  28. auto parse_pledge = [&](auto& pledge_spec, u32& mask) {
  29. auto parts = pledge_spec.split_view(' ');
  30. for (auto& part : parts) {
  31. #define __ENUMERATE_PLEDGE_PROMISE(x) \
  32. if (part == #x) { \
  33. mask |= (1u << (u32)Pledge::x); \
  34. continue; \
  35. }
  36. ENUMERATE_PLEDGE_PROMISES
  37. #undef __ENUMERATE_PLEDGE_PROMISE
  38. return false;
  39. }
  40. return true;
  41. };
  42. ProtectedDataMutationScope scope { *this };
  43. if (!promises.is_null()) {
  44. u32 new_promises = 0;
  45. if (!parse_pledge(promises, new_promises))
  46. return EINVAL;
  47. if (m_promises && (!new_promises || new_promises & ~m_promises))
  48. return EPERM;
  49. m_has_promises = true;
  50. m_promises = new_promises;
  51. }
  52. if (!execpromises.is_null()) {
  53. u32 new_execpromises = 0;
  54. if (!parse_pledge(execpromises, new_execpromises))
  55. return EINVAL;
  56. if (m_execpromises && (!new_execpromises || new_execpromises & ~m_execpromises))
  57. return EPERM;
  58. m_has_execpromises = true;
  59. m_execpromises = new_execpromises;
  60. }
  61. return 0;
  62. }
  63. }