process.cpp 2.3 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/Types.h>
  7. #include <Kernel/Process.h>
  8. namespace Kernel {
  9. KResultOr<FlatPtr> Process::sys$getpid()
  10. {
  11. VERIFY_NO_PROCESS_BIG_LOCK(this)
  12. REQUIRE_PROMISE(stdio);
  13. return pid().value();
  14. }
  15. KResultOr<FlatPtr> Process::sys$getppid()
  16. {
  17. VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
  18. REQUIRE_PROMISE(stdio);
  19. return m_protected_values.ppid.value();
  20. }
  21. KResultOr<FlatPtr> Process::sys$get_process_name(Userspace<char*> buffer, size_t buffer_size)
  22. {
  23. VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
  24. REQUIRE_PROMISE(stdio);
  25. if (m_name.length() + 1 > buffer_size)
  26. return ENAMETOOLONG;
  27. if (!copy_to_user(buffer, m_name.characters(), m_name.length() + 1))
  28. return EFAULT;
  29. return 0;
  30. }
  31. KResultOr<FlatPtr> Process::sys$set_process_name(Userspace<const char*> user_name, size_t user_name_length)
  32. {
  33. VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
  34. REQUIRE_PROMISE(proc);
  35. if (user_name_length > 256)
  36. return ENAMETOOLONG;
  37. auto name_or_error = try_copy_kstring_from_user(user_name, user_name_length);
  38. if (name_or_error.is_error())
  39. return name_or_error.error();
  40. // Empty and whitespace-only names only exist to confuse users.
  41. if (name_or_error.value()->view().is_whitespace())
  42. return EINVAL;
  43. // FIXME: There's a String copy here. Process::m_name should be a KString.
  44. m_name = name_or_error.value()->view();
  45. return 0;
  46. }
  47. KResultOr<FlatPtr> Process::sys$set_coredump_metadata(Userspace<const Syscall::SC_set_coredump_metadata_params*> user_params)
  48. {
  49. VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
  50. Syscall::SC_set_coredump_metadata_params params;
  51. if (!copy_from_user(&params, user_params))
  52. return EFAULT;
  53. if (params.key.length == 0 || params.key.length > 16 * KiB)
  54. return EINVAL;
  55. if (params.value.length > 16 * KiB)
  56. return EINVAL;
  57. auto key_or_error = try_copy_kstring_from_user(params.key);
  58. if (key_or_error.is_error())
  59. return key_or_error.error();
  60. auto key = key_or_error.release_value();
  61. auto value_or_error = try_copy_kstring_from_user(params.value);
  62. if (value_or_error.is_error())
  63. return value_or_error.error();
  64. auto value = value_or_error.release_value();
  65. return set_coredump_property(move(key), move(value));
  66. }
  67. }