process.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. REQUIRE_PROMISE(stdio);
  12. return pid().value();
  13. }
  14. KResultOr<FlatPtr> Process::sys$getppid()
  15. {
  16. REQUIRE_PROMISE(stdio);
  17. return m_ppid.value();
  18. }
  19. KResultOr<FlatPtr> Process::sys$get_process_name(Userspace<char*> buffer, size_t buffer_size)
  20. {
  21. REQUIRE_PROMISE(stdio);
  22. if (m_name.length() + 1 > buffer_size)
  23. return ENAMETOOLONG;
  24. if (!copy_to_user(buffer, m_name.characters(), m_name.length() + 1))
  25. return EFAULT;
  26. return 0;
  27. }
  28. KResultOr<FlatPtr> Process::sys$set_process_name(Userspace<const char*> user_name, size_t user_name_length)
  29. {
  30. REQUIRE_PROMISE(proc);
  31. if (user_name_length > 256)
  32. return ENAMETOOLONG;
  33. auto name = copy_string_from_user(user_name, user_name_length);
  34. if (name.is_null())
  35. return EFAULT;
  36. // Empty and whitespace-only names only exist to confuse users.
  37. if (name.is_whitespace())
  38. return EINVAL;
  39. m_name = move(name);
  40. return 0;
  41. }
  42. KResultOr<FlatPtr> Process::sys$set_coredump_metadata(Userspace<const Syscall::SC_set_coredump_metadata_params*> user_params)
  43. {
  44. Syscall::SC_set_coredump_metadata_params params;
  45. if (!copy_from_user(&params, user_params))
  46. return EFAULT;
  47. if (params.key.length == 0 || params.key.length > 16 * KiB)
  48. return EINVAL;
  49. if (params.value.length > 16 * KiB)
  50. return EINVAL;
  51. auto copied_key = copy_string_from_user(params.key.characters, params.key.length);
  52. if (copied_key.is_null())
  53. return EFAULT;
  54. auto copied_value = copy_string_from_user(params.value.characters, params.value.length);
  55. if (copied_value.is_null())
  56. return EFAULT;
  57. if (!m_coredump_metadata.contains(copied_key) && m_coredump_metadata.size() >= 16)
  58. return EFAULT;
  59. m_coredump_metadata.set(move(copied_key), move(copied_value));
  60. return 0;
  61. }
  62. }