Process.h 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. *
  8. * 1. Redistributions of source code must retain the above copyright notice, this
  9. * list of conditions and the following disclaimer.
  10. *
  11. * 2. Redistributions in binary form must reproduce the above copyright notice,
  12. * this list of conditions and the following disclaimer in the documentation
  13. * and/or other materials provided with the distribution.
  14. *
  15. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  16. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  18. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  19. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  21. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  22. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  23. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  24. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. */
  26. #pragma once
  27. #include <AK/Checked.h>
  28. #include <AK/HashMap.h>
  29. #include <AK/InlineLinkedList.h>
  30. #include <AK/NonnullOwnPtrVector.h>
  31. #include <AK/NonnullRefPtrVector.h>
  32. #include <AK/String.h>
  33. #include <AK/Userspace.h>
  34. #include <AK/WeakPtr.h>
  35. #include <AK/Weakable.h>
  36. #include <Kernel/API/Syscall.h>
  37. #include <Kernel/FileSystem/InodeMetadata.h>
  38. #include <Kernel/Forward.h>
  39. #include <Kernel/FutexQueue.h>
  40. #include <Kernel/Lock.h>
  41. #include <Kernel/ProcessGroup.h>
  42. #include <Kernel/StdLib.h>
  43. #include <Kernel/Thread.h>
  44. #include <Kernel/ThreadTracer.h>
  45. #include <Kernel/UnixTypes.h>
  46. #include <Kernel/UnveilNode.h>
  47. #include <Kernel/VM/AllocationStrategy.h>
  48. #include <Kernel/VM/RangeAllocator.h>
  49. #include <Kernel/VM/Space.h>
  50. #include <LibC/signal_numbers.h>
  51. #include <LibELF/exec_elf.h>
  52. namespace Kernel {
  53. timeval kgettimeofday();
  54. void kgettimeofday(timeval&);
  55. #define ENUMERATE_PLEDGE_PROMISES \
  56. __ENUMERATE_PLEDGE_PROMISE(stdio) \
  57. __ENUMERATE_PLEDGE_PROMISE(rpath) \
  58. __ENUMERATE_PLEDGE_PROMISE(wpath) \
  59. __ENUMERATE_PLEDGE_PROMISE(cpath) \
  60. __ENUMERATE_PLEDGE_PROMISE(dpath) \
  61. __ENUMERATE_PLEDGE_PROMISE(inet) \
  62. __ENUMERATE_PLEDGE_PROMISE(id) \
  63. __ENUMERATE_PLEDGE_PROMISE(proc) \
  64. __ENUMERATE_PLEDGE_PROMISE(ptrace) \
  65. __ENUMERATE_PLEDGE_PROMISE(exec) \
  66. __ENUMERATE_PLEDGE_PROMISE(unix) \
  67. __ENUMERATE_PLEDGE_PROMISE(recvfd) \
  68. __ENUMERATE_PLEDGE_PROMISE(sendfd) \
  69. __ENUMERATE_PLEDGE_PROMISE(fattr) \
  70. __ENUMERATE_PLEDGE_PROMISE(tty) \
  71. __ENUMERATE_PLEDGE_PROMISE(chown) \
  72. __ENUMERATE_PLEDGE_PROMISE(chroot) \
  73. __ENUMERATE_PLEDGE_PROMISE(thread) \
  74. __ENUMERATE_PLEDGE_PROMISE(video) \
  75. __ENUMERATE_PLEDGE_PROMISE(accept) \
  76. __ENUMERATE_PLEDGE_PROMISE(settime) \
  77. __ENUMERATE_PLEDGE_PROMISE(sigaction) \
  78. __ENUMERATE_PLEDGE_PROMISE(setkeymap) \
  79. __ENUMERATE_PLEDGE_PROMISE(prot_exec) \
  80. __ENUMERATE_PLEDGE_PROMISE(map_fixed) \
  81. __ENUMERATE_PLEDGE_PROMISE(getkeymap)
  82. enum class Pledge : u32 {
  83. #define __ENUMERATE_PLEDGE_PROMISE(x) x,
  84. ENUMERATE_PLEDGE_PROMISES
  85. #undef __ENUMERATE_PLEDGE_PROMISE
  86. };
  87. enum class VeilState {
  88. None,
  89. Dropped,
  90. Locked,
  91. };
  92. typedef HashMap<FlatPtr, RefPtr<FutexQueue>> FutexQueues;
  93. struct LoadResult;
  94. class Process
  95. : public RefCounted<Process>
  96. , public InlineLinkedListNode<Process>
  97. , public Weakable<Process> {
  98. AK_MAKE_NONCOPYABLE(Process);
  99. AK_MAKE_NONMOVABLE(Process);
  100. friend class InlineLinkedListNode<Process>;
  101. friend class Thread;
  102. friend class CoreDump;
  103. public:
  104. inline static Process* current()
  105. {
  106. auto current_thread = Processor::current_thread();
  107. return current_thread ? &current_thread->process() : nullptr;
  108. }
  109. template<typename EntryFunction>
  110. static RefPtr<Process> create_kernel_process(RefPtr<Thread>& first_thread, String&& name, EntryFunction entry, u32 affinity = THREAD_AFFINITY_DEFAULT)
  111. {
  112. auto* entry_func = new EntryFunction(move(entry));
  113. return create_kernel_process(
  114. first_thread, move(name), [](void* data) {
  115. EntryFunction* func = reinterpret_cast<EntryFunction*>(data);
  116. (*func)();
  117. delete func;
  118. },
  119. entry_func, affinity);
  120. }
  121. static RefPtr<Process> create_kernel_process(RefPtr<Thread>& first_thread, String&& name, void (*entry)(void*), void* entry_data = nullptr, u32 affinity = THREAD_AFFINITY_DEFAULT);
  122. static RefPtr<Process> create_user_process(RefPtr<Thread>& first_thread, const String& path, uid_t, gid_t, ProcessID ppid, int& error, Vector<String>&& arguments = Vector<String>(), Vector<String>&& environment = Vector<String>(), TTY* = nullptr);
  123. ~Process();
  124. static Vector<ProcessID> all_pids();
  125. static NonnullRefPtrVector<Process> all_processes();
  126. template<typename EntryFunction>
  127. RefPtr<Thread> create_kernel_thread(EntryFunction entry, u32 priority, const String& name, u32 affinity = THREAD_AFFINITY_DEFAULT, bool joinable = true)
  128. {
  129. auto* entry_func = new EntryFunction(move(entry));
  130. return create_kernel_thread([](void* data) {
  131. EntryFunction* func = reinterpret_cast<EntryFunction*>(data);
  132. (*func)();
  133. delete func;
  134. },
  135. priority, name, affinity, joinable);
  136. }
  137. RefPtr<Thread> create_kernel_thread(void (*entry)(void*), void* entry_data, u32 priority, const String& name, u32 affinity = THREAD_AFFINITY_DEFAULT, bool joinable = true);
  138. bool is_profiling() const { return m_profiling; }
  139. void set_profiling(bool profiling) { m_profiling = profiling; }
  140. bool should_core_dump() const { return m_should_dump_core; }
  141. void set_dump_core(bool dump_core) { m_should_dump_core = dump_core; }
  142. bool is_dead() const { return m_dead; }
  143. bool is_stopped() const { return m_is_stopped; }
  144. bool set_stopped(bool stopped) { return m_is_stopped.exchange(stopped); }
  145. bool is_kernel_process() const { return m_is_kernel_process; }
  146. bool is_user_process() const { return !m_is_kernel_process; }
  147. static RefPtr<Process> from_pid(ProcessID);
  148. static SessionID get_sid_from_pgid(ProcessGroupID pgid);
  149. const String& name() const { return m_name; }
  150. ProcessID pid() const { return m_pid; }
  151. SessionID sid() const { return m_sid; }
  152. bool is_session_leader() const { return m_sid.value() == m_pid.value(); }
  153. ProcessGroupID pgid() const { return m_pg ? m_pg->pgid() : 0; }
  154. bool is_group_leader() const { return pgid().value() == m_pid.value(); }
  155. Span<const gid_t> extra_gids() const { return m_extra_gids; }
  156. uid_t euid() const { return m_euid; }
  157. gid_t egid() const { return m_egid; }
  158. uid_t uid() const { return m_uid; }
  159. gid_t gid() const { return m_gid; }
  160. uid_t suid() const { return m_suid; }
  161. gid_t sgid() const { return m_sgid; }
  162. ProcessID ppid() const { return m_ppid; }
  163. bool is_dumpable() const { return m_dumpable; }
  164. void set_dumpable(bool dumpable) { m_dumpable = dumpable; }
  165. mode_t umask() const { return m_umask; }
  166. bool in_group(gid_t) const;
  167. RefPtr<FileDescription> file_description(int fd) const;
  168. int fd_flags(int fd) const;
  169. template<typename Callback>
  170. static void for_each(Callback);
  171. template<typename Callback>
  172. static void for_each_in_pgrp(ProcessGroupID, Callback);
  173. template<typename Callback>
  174. void for_each_child(Callback);
  175. template<typename Callback>
  176. IterationDecision for_each_thread(Callback) const;
  177. void die();
  178. void finalize();
  179. ThreadTracer* tracer() { return m_tracer.ptr(); }
  180. bool is_traced() const { return !!m_tracer; }
  181. void start_tracing_from(ProcessID tracer);
  182. void stop_tracing();
  183. void tracer_trap(Thread&, const RegisterState&);
  184. KResultOr<int> sys$yield();
  185. KResultOr<int> sys$sync();
  186. KResultOr<int> sys$beep();
  187. KResultOr<int> sys$get_process_name(Userspace<char*> buffer, size_t buffer_size);
  188. KResultOr<int> sys$set_process_name(Userspace<const char*> user_name, size_t user_name_length);
  189. KResultOr<int> sys$watch_file(Userspace<const char*> path, size_t path_length);
  190. KResultOr<int> sys$dbgputch(u8);
  191. KResultOr<int> sys$dbgputstr(Userspace<const u8*>, int length);
  192. KResultOr<int> sys$dump_backtrace();
  193. KResultOr<pid_t> sys$gettid();
  194. KResultOr<int> sys$donate(pid_t tid);
  195. KResultOr<int> sys$ftruncate(int fd, off_t);
  196. KResultOr<pid_t> sys$setsid();
  197. KResultOr<pid_t> sys$getsid(pid_t);
  198. KResultOr<int> sys$setpgid(pid_t pid, pid_t pgid);
  199. KResultOr<pid_t> sys$getpgrp();
  200. KResultOr<pid_t> sys$getpgid(pid_t);
  201. KResultOr<uid_t> sys$getuid();
  202. KResultOr<gid_t> sys$getgid();
  203. KResultOr<uid_t> sys$geteuid();
  204. KResultOr<gid_t> sys$getegid();
  205. KResultOr<pid_t> sys$getpid();
  206. KResultOr<pid_t> sys$getppid();
  207. KResultOr<int> sys$getresuid(Userspace<uid_t*>, Userspace<uid_t*>, Userspace<uid_t*>);
  208. KResultOr<int> sys$getresgid(Userspace<gid_t*>, Userspace<gid_t*>, Userspace<gid_t*>);
  209. KResultOr<mode_t> sys$umask(mode_t);
  210. KResultOr<int> sys$open(Userspace<const Syscall::SC_open_params*>);
  211. KResultOr<int> sys$close(int fd);
  212. KResultOr<ssize_t> sys$read(int fd, Userspace<u8*>, ssize_t);
  213. KResultOr<ssize_t> sys$readv(int fd, Userspace<const struct iovec*> iov, int iov_count);
  214. KResultOr<ssize_t> sys$write(int fd, Userspace<const u8*>, ssize_t);
  215. KResultOr<ssize_t> sys$writev(int fd, Userspace<const struct iovec*> iov, int iov_count);
  216. KResultOr<int> sys$fstat(int fd, Userspace<stat*>);
  217. KResultOr<int> sys$stat(Userspace<const Syscall::SC_stat_params*>);
  218. KResultOr<int> sys$lseek(int fd, off_t, int whence);
  219. KResultOr<int> sys$kill(pid_t pid_or_pgid, int sig);
  220. [[noreturn]] void sys$exit(int status);
  221. KResultOr<int> sys$sigreturn(RegisterState& registers);
  222. KResultOr<pid_t> sys$waitid(Userspace<const Syscall::SC_waitid_params*>);
  223. KResultOr<FlatPtr> sys$mmap(Userspace<const Syscall::SC_mmap_params*>);
  224. KResultOr<FlatPtr> sys$mremap(Userspace<const Syscall::SC_mremap_params*>);
  225. KResultOr<int> sys$munmap(void*, size_t size);
  226. KResultOr<int> sys$set_mmap_name(Userspace<const Syscall::SC_set_mmap_name_params*>);
  227. KResultOr<int> sys$mprotect(void*, size_t, int prot);
  228. KResultOr<int> sys$madvise(void*, size_t, int advice);
  229. KResultOr<int> sys$msyscall(void*);
  230. KResultOr<int> sys$purge(int mode);
  231. KResultOr<int> sys$select(const Syscall::SC_select_params*);
  232. KResultOr<int> sys$poll(Userspace<const Syscall::SC_poll_params*>);
  233. KResultOr<ssize_t> sys$get_dir_entries(int fd, Userspace<void*>, ssize_t);
  234. KResultOr<int> sys$getcwd(Userspace<char*>, size_t);
  235. KResultOr<int> sys$chdir(Userspace<const char*>, size_t);
  236. KResultOr<int> sys$fchdir(int fd);
  237. KResultOr<int> sys$adjtime(Userspace<const timeval*>, Userspace<timeval*>);
  238. KResultOr<int> sys$gettimeofday(Userspace<timeval*>);
  239. KResultOr<int> sys$clock_gettime(clockid_t, Userspace<timespec*>);
  240. KResultOr<int> sys$clock_settime(clockid_t, Userspace<const timespec*>);
  241. KResultOr<int> sys$clock_nanosleep(Userspace<const Syscall::SC_clock_nanosleep_params*>);
  242. KResultOr<int> sys$gethostname(Userspace<char*>, ssize_t);
  243. KResultOr<int> sys$sethostname(Userspace<const char*>, ssize_t);
  244. KResultOr<int> sys$uname(Userspace<utsname*>);
  245. KResultOr<int> sys$readlink(Userspace<const Syscall::SC_readlink_params*>);
  246. KResultOr<int> sys$ttyname(int fd, Userspace<char*>, size_t);
  247. KResultOr<int> sys$ptsname(int fd, Userspace<char*>, size_t);
  248. KResultOr<pid_t> sys$fork(RegisterState&);
  249. KResultOr<int> sys$execve(Userspace<const Syscall::SC_execve_params*>);
  250. KResultOr<int> sys$dup2(int old_fd, int new_fd);
  251. KResultOr<int> sys$sigaction(int signum, Userspace<const sigaction*> act, Userspace<sigaction*> old_act);
  252. KResultOr<int> sys$sigprocmask(int how, Userspace<const sigset_t*> set, Userspace<sigset_t*> old_set);
  253. KResultOr<int> sys$sigpending(Userspace<sigset_t*>);
  254. KResultOr<int> sys$getgroups(ssize_t, Userspace<gid_t*>);
  255. KResultOr<int> sys$setgroups(ssize_t, Userspace<const gid_t*>);
  256. KResultOr<int> sys$pipe(int pipefd[2], int flags);
  257. KResultOr<int> sys$killpg(pid_t pgrp, int sig);
  258. KResultOr<int> sys$seteuid(uid_t);
  259. KResultOr<int> sys$setegid(gid_t);
  260. KResultOr<int> sys$setuid(uid_t);
  261. KResultOr<int> sys$setgid(gid_t);
  262. KResultOr<int> sys$setresuid(uid_t, uid_t, uid_t);
  263. KResultOr<int> sys$setresgid(gid_t, gid_t, gid_t);
  264. KResultOr<unsigned> sys$alarm(unsigned seconds);
  265. KResultOr<int> sys$access(Userspace<const char*> pathname, size_t path_length, int mode);
  266. KResultOr<int> sys$fcntl(int fd, int cmd, u32 extra_arg);
  267. KResultOr<int> sys$ioctl(int fd, unsigned request, FlatPtr arg);
  268. KResultOr<int> sys$mkdir(Userspace<const char*> pathname, size_t path_length, mode_t mode);
  269. KResultOr<clock_t> sys$times(Userspace<tms*>);
  270. KResultOr<int> sys$utime(Userspace<const char*> pathname, size_t path_length, Userspace<const struct utimbuf*>);
  271. KResultOr<int> sys$link(Userspace<const Syscall::SC_link_params*>);
  272. KResultOr<int> sys$unlink(Userspace<const char*> pathname, size_t path_length);
  273. KResultOr<int> sys$symlink(Userspace<const Syscall::SC_symlink_params*>);
  274. KResultOr<int> sys$rmdir(Userspace<const char*> pathname, size_t path_length);
  275. KResultOr<int> sys$mount(Userspace<const Syscall::SC_mount_params*>);
  276. KResultOr<int> sys$umount(Userspace<const char*> mountpoint, size_t mountpoint_length);
  277. KResultOr<int> sys$chmod(Userspace<const char*> pathname, size_t path_length, mode_t);
  278. KResultOr<int> sys$fchmod(int fd, mode_t);
  279. KResultOr<int> sys$chown(Userspace<const Syscall::SC_chown_params*>);
  280. KResultOr<int> sys$fchown(int fd, uid_t, gid_t);
  281. KResultOr<int> sys$socket(int domain, int type, int protocol);
  282. KResultOr<int> sys$bind(int sockfd, Userspace<const sockaddr*> addr, socklen_t);
  283. KResultOr<int> sys$listen(int sockfd, int backlog);
  284. KResultOr<int> sys$accept(int sockfd, Userspace<sockaddr*>, Userspace<socklen_t*>);
  285. KResultOr<int> sys$connect(int sockfd, Userspace<const sockaddr*>, socklen_t);
  286. KResultOr<int> sys$shutdown(int sockfd, int how);
  287. KResultOr<ssize_t> sys$sendmsg(int sockfd, Userspace<const struct msghdr*>, int flags);
  288. KResultOr<ssize_t> sys$recvmsg(int sockfd, Userspace<struct msghdr*>, int flags);
  289. KResultOr<int> sys$getsockopt(Userspace<const Syscall::SC_getsockopt_params*>);
  290. KResultOr<int> sys$setsockopt(Userspace<const Syscall::SC_setsockopt_params*>);
  291. KResultOr<int> sys$getsockname(Userspace<const Syscall::SC_getsockname_params*>);
  292. KResultOr<int> sys$getpeername(Userspace<const Syscall::SC_getpeername_params*>);
  293. KResultOr<int> sys$sched_setparam(pid_t pid, Userspace<const struct sched_param*>);
  294. KResultOr<int> sys$sched_getparam(pid_t pid, Userspace<struct sched_param*>);
  295. KResultOr<int> sys$create_thread(void* (*)(void*), Userspace<const Syscall::SC_create_thread_params*>);
  296. [[noreturn]] void sys$exit_thread(Userspace<void*>);
  297. KResultOr<int> sys$join_thread(pid_t tid, Userspace<void**> exit_value);
  298. KResultOr<int> sys$detach_thread(pid_t tid);
  299. KResultOr<int> sys$set_thread_name(pid_t tid, Userspace<const char*> buffer, size_t buffer_size);
  300. KResultOr<int> sys$get_thread_name(pid_t tid, Userspace<char*> buffer, size_t buffer_size);
  301. KResultOr<int> sys$rename(Userspace<const Syscall::SC_rename_params*>);
  302. KResultOr<int> sys$mknod(Userspace<const Syscall::SC_mknod_params*>);
  303. KResultOr<int> sys$halt();
  304. KResultOr<int> sys$reboot();
  305. KResultOr<int> sys$realpath(Userspace<const Syscall::SC_realpath_params*>);
  306. KResultOr<ssize_t> sys$getrandom(Userspace<void*>, size_t, unsigned int);
  307. KResultOr<int> sys$getkeymap(Userspace<const Syscall::SC_getkeymap_params*>);
  308. KResultOr<int> sys$setkeymap(Userspace<const Syscall::SC_setkeymap_params*>);
  309. KResultOr<int> sys$module_load(Userspace<const char*> path, size_t path_length);
  310. KResultOr<int> sys$module_unload(Userspace<const char*> name, size_t name_length);
  311. KResultOr<int> sys$profiling_enable(pid_t);
  312. KResultOr<int> sys$profiling_disable(pid_t);
  313. KResultOr<int> sys$futex(Userspace<const Syscall::SC_futex_params*>);
  314. KResultOr<int> sys$chroot(Userspace<const char*> path, size_t path_length, int mount_flags);
  315. KResultOr<int> sys$pledge(Userspace<const Syscall::SC_pledge_params*>);
  316. KResultOr<int> sys$unveil(Userspace<const Syscall::SC_unveil_params*>);
  317. KResultOr<int> sys$perf_event(int type, FlatPtr arg1, FlatPtr arg2);
  318. KResultOr<int> sys$get_stack_bounds(Userspace<FlatPtr*> stack_base, Userspace<size_t*> stack_size);
  319. KResultOr<int> sys$ptrace(Userspace<const Syscall::SC_ptrace_params*>);
  320. KResultOr<int> sys$sendfd(int sockfd, int fd);
  321. KResultOr<int> sys$recvfd(int sockfd, int options);
  322. KResultOr<long> sys$sysconf(int name);
  323. KResultOr<int> sys$disown(ProcessID);
  324. KResultOr<FlatPtr> sys$allocate_tls(size_t);
  325. KResultOr<int> sys$prctl(int option, FlatPtr arg1, FlatPtr arg2);
  326. KResultOr<int> sys$set_coredump_metadata(Userspace<const Syscall::SC_set_coredump_metadata_params*>);
  327. [[noreturn]] void sys$abort();
  328. KResultOr<int> sys$anon_create(size_t, int options);
  329. template<bool sockname, typename Params>
  330. int get_sock_or_peer_name(const Params&);
  331. static void initialize();
  332. [[noreturn]] void crash(int signal, u32 eip, bool out_of_memory = false);
  333. [[nodiscard]] siginfo_t wait_info();
  334. const TTY* tty() const { return m_tty; }
  335. void set_tty(TTY*);
  336. u32 m_ticks_in_user { 0 };
  337. u32 m_ticks_in_kernel { 0 };
  338. u32 m_ticks_in_user_for_dead_children { 0 };
  339. u32 m_ticks_in_kernel_for_dead_children { 0 };
  340. Custody& current_directory();
  341. Custody* executable() { return m_executable.ptr(); }
  342. const Custody* executable() const { return m_executable.ptr(); }
  343. const Vector<String>& arguments() const { return m_arguments; };
  344. const Vector<String>& environment() const { return m_environment; };
  345. int number_of_open_file_descriptors() const;
  346. int max_open_file_descriptors() const
  347. {
  348. return m_max_open_file_descriptors;
  349. }
  350. KResult exec(String path, Vector<String> arguments, Vector<String> environment, int recusion_depth = 0);
  351. KResultOr<LoadResult> load(NonnullRefPtr<FileDescription> main_program_description, RefPtr<FileDescription> interpreter_description, const Elf32_Ehdr& main_program_header);
  352. bool is_superuser() const
  353. {
  354. return m_euid == 0;
  355. }
  356. void terminate_due_to_signal(u8 signal);
  357. KResult send_signal(u8 signal, Process* sender);
  358. u8 termination_signal() const { return m_termination_signal; }
  359. u16 thread_count() const
  360. {
  361. return m_thread_count.load(AK::MemoryOrder::memory_order_relaxed);
  362. }
  363. Lock& big_lock() { return m_big_lock; }
  364. Lock& ptrace_lock() { return m_ptrace_lock; }
  365. Custody& root_directory();
  366. Custody& root_directory_relative_to_global_root();
  367. void set_root_directory(const Custody&);
  368. bool has_promises() const
  369. {
  370. return m_has_promises;
  371. }
  372. bool has_promised(Pledge pledge) const
  373. {
  374. return m_promises & (1u << (u32)pledge);
  375. }
  376. VeilState veil_state() const
  377. {
  378. return m_veil_state;
  379. }
  380. const UnveilNode& unveiled_paths() const
  381. {
  382. return m_unveiled_paths;
  383. }
  384. bool wait_for_tracer_at_next_execve() const
  385. {
  386. return m_wait_for_tracer_at_next_execve;
  387. }
  388. void set_wait_for_tracer_at_next_execve(bool val)
  389. {
  390. m_wait_for_tracer_at_next_execve = val;
  391. }
  392. KResultOr<u32> peek_user_data(Userspace<const u32*> address);
  393. KResult poke_user_data(Userspace<u32*> address, u32 data);
  394. void disowned_by_waiter(Process& process);
  395. void unblock_waiters(Thread::WaitBlocker::UnblockFlags, u8 signal = 0);
  396. Thread::WaitBlockCondition& wait_block_condition() { return m_wait_block_condition; }
  397. HashMap<String, String>& coredump_metadata() { return m_coredump_metadata; }
  398. const HashMap<String, String>& coredump_metadata() const { return m_coredump_metadata; }
  399. const NonnullRefPtrVector<Thread>& threads_for_coredump(Badge<CoreDump>) const { return m_threads_for_coredump; }
  400. PerformanceEventBuffer* perf_events() { return m_perf_event_buffer; }
  401. Space& space() { return *m_space; }
  402. const Space& space() const { return *m_space; }
  403. VirtualAddress signal_trampoline() const { return m_signal_trampoline; }
  404. private:
  405. friend class MemoryManager;
  406. friend class Scheduler;
  407. friend class Region;
  408. bool add_thread(Thread&);
  409. bool remove_thread(Thread&);
  410. PerformanceEventBuffer& ensure_perf_events();
  411. Process(RefPtr<Thread>& first_thread, const String& name, uid_t, gid_t, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> cwd = nullptr, RefPtr<Custody> executable = nullptr, TTY* = nullptr, Process* fork_parent = nullptr);
  412. static ProcessID allocate_pid();
  413. void kill_threads_except_self();
  414. void kill_all_threads();
  415. bool dump_core();
  416. bool dump_perfcore();
  417. KResult do_exec(NonnullRefPtr<FileDescription> main_program_description, Vector<String> arguments, Vector<String> environment, RefPtr<FileDescription> interpreter_description, Thread*& new_main_thread, u32& prev_flags, const Elf32_Ehdr& main_program_header);
  418. KResultOr<ssize_t> do_write(FileDescription&, const UserOrKernelBuffer&, size_t);
  419. KResultOr<RefPtr<FileDescription>> find_elf_interpreter_for_executable(const String& path, const Elf32_Ehdr& elf_header, int nread, size_t file_size);
  420. int alloc_fd(int first_candidate_fd = 0);
  421. KResult do_kill(Process&, int signal);
  422. KResult do_killpg(ProcessGroupID pgrp, int signal);
  423. KResult do_killall(int signal);
  424. KResult do_killself(int signal);
  425. KResultOr<siginfo_t> do_waitid(idtype_t idtype, int id, int options);
  426. KResultOr<String> get_syscall_path_argument(const char* user_path, size_t path_length) const;
  427. KResultOr<String> get_syscall_path_argument(Userspace<const char*> user_path, size_t path_length) const
  428. {
  429. return get_syscall_path_argument(user_path.unsafe_userspace_ptr(), path_length);
  430. }
  431. KResultOr<String> get_syscall_path_argument(const Syscall::StringArgument&) const;
  432. bool has_tracee_thread(ProcessID tracer_pid);
  433. void clear_futex_queues_on_exec();
  434. Process* m_prev { nullptr };
  435. Process* m_next { nullptr };
  436. String m_name;
  437. OwnPtr<Space> m_space;
  438. VirtualAddress m_signal_trampoline;
  439. ProcessID m_pid { 0 };
  440. SessionID m_sid { 0 };
  441. RefPtr<ProcessGroup> m_pg;
  442. uid_t m_euid { 0 };
  443. gid_t m_egid { 0 };
  444. uid_t m_uid { 0 };
  445. gid_t m_gid { 0 };
  446. uid_t m_suid { 0 };
  447. gid_t m_sgid { 0 };
  448. OwnPtr<ThreadTracer> m_tracer;
  449. static const int m_max_open_file_descriptors { FD_SETSIZE };
  450. class FileDescriptionAndFlags {
  451. public:
  452. operator bool() const { return !!m_description; }
  453. FileDescription* description() { return m_description; }
  454. const FileDescription* description() const { return m_description; }
  455. u32 flags() const { return m_flags; }
  456. void set_flags(u32 flags) { m_flags = flags; }
  457. void clear();
  458. void set(NonnullRefPtr<FileDescription>&&, u32 flags = 0);
  459. private:
  460. RefPtr<FileDescription> m_description;
  461. u32 m_flags { 0 };
  462. };
  463. Vector<FileDescriptionAndFlags> m_fds;
  464. u8 m_termination_status { 0 };
  465. u8 m_termination_signal { 0 };
  466. Atomic<u32> m_thread_count { 0 };
  467. mutable IntrusiveList<Thread, &Thread::m_process_thread_list_node> m_thread_list;
  468. mutable RecursiveSpinLock m_thread_list_lock;
  469. const bool m_is_kernel_process;
  470. bool m_dead { false };
  471. bool m_profiling { false };
  472. Atomic<bool, AK::MemoryOrder::memory_order_relaxed> m_is_stopped { false };
  473. bool m_should_dump_core { false };
  474. RefPtr<Custody> m_executable;
  475. RefPtr<Custody> m_cwd;
  476. RefPtr<Custody> m_root_directory;
  477. RefPtr<Custody> m_root_directory_relative_to_global_root;
  478. Vector<String> m_arguments;
  479. Vector<String> m_environment;
  480. RefPtr<TTY> m_tty;
  481. ProcessID m_ppid { 0 };
  482. mode_t m_umask { 022 };
  483. bool m_dumpable { true };
  484. Vector<gid_t> m_extra_gids;
  485. WeakPtr<Region> m_master_tls_region;
  486. size_t m_master_tls_size { 0 };
  487. size_t m_master_tls_alignment { 0 };
  488. Lock m_big_lock { "Process" };
  489. Lock m_ptrace_lock { "ptrace" };
  490. RefPtr<Timer> m_alarm_timer;
  491. bool m_has_promises { false };
  492. u32 m_promises { 0 };
  493. bool m_has_execpromises { false };
  494. u32 m_execpromises { 0 };
  495. VeilState m_veil_state { VeilState::None };
  496. UnveilNode m_unveiled_paths { "/", { .full_path = "/", .unveil_inherited_from_root = true } };
  497. OwnPtr<PerformanceEventBuffer> m_perf_event_buffer;
  498. FutexQueues m_futex_queues;
  499. SpinLock<u8> m_futex_lock;
  500. // This member is used in the implementation of ptrace's PT_TRACEME flag.
  501. // If it is set to true, the process will stop at the next execve syscall
  502. // and wait for a tracer to attach.
  503. bool m_wait_for_tracer_at_next_execve { false };
  504. Thread::WaitBlockCondition m_wait_block_condition;
  505. HashMap<String, String> m_coredump_metadata;
  506. NonnullRefPtrVector<Thread> m_threads_for_coredump;
  507. };
  508. extern InlineLinkedList<Process>* g_processes;
  509. extern RecursiveSpinLock g_processes_lock;
  510. template<typename Callback>
  511. inline void Process::for_each(Callback callback)
  512. {
  513. VERIFY_INTERRUPTS_DISABLED();
  514. ScopedSpinLock lock(g_processes_lock);
  515. for (auto* process = g_processes->head(); process;) {
  516. auto* next_process = process->next();
  517. if (callback(*process) == IterationDecision::Break)
  518. break;
  519. process = next_process;
  520. }
  521. }
  522. template<typename Callback>
  523. inline void Process::for_each_child(Callback callback)
  524. {
  525. VERIFY_INTERRUPTS_DISABLED();
  526. ProcessID my_pid = pid();
  527. ScopedSpinLock lock(g_processes_lock);
  528. for (auto* process = g_processes->head(); process;) {
  529. auto* next_process = process->next();
  530. if (process->ppid() == my_pid || process->has_tracee_thread(m_pid)) {
  531. if (callback(*process) == IterationDecision::Break)
  532. break;
  533. }
  534. process = next_process;
  535. }
  536. }
  537. template<typename Callback>
  538. inline IterationDecision Process::for_each_thread(Callback callback) const
  539. {
  540. ScopedSpinLock thread_list_lock(m_thread_list_lock);
  541. for (auto& thread : m_thread_list) {
  542. IterationDecision decision = callback(thread);
  543. if (decision != IterationDecision::Continue)
  544. return decision;
  545. }
  546. return IterationDecision::Continue;
  547. }
  548. template<typename Callback>
  549. inline void Process::for_each_in_pgrp(ProcessGroupID pgid, Callback callback)
  550. {
  551. VERIFY_INTERRUPTS_DISABLED();
  552. ScopedSpinLock lock(g_processes_lock);
  553. for (auto* process = g_processes->head(); process;) {
  554. auto* next_process = process->next();
  555. if (!process->is_dead() && process->pgid() == pgid) {
  556. if (callback(*process) == IterationDecision::Break)
  557. break;
  558. }
  559. process = next_process;
  560. }
  561. }
  562. inline bool InodeMetadata::may_read(const Process& process) const
  563. {
  564. return may_read(process.euid(), process.egid(), process.extra_gids());
  565. }
  566. inline bool InodeMetadata::may_write(const Process& process) const
  567. {
  568. return may_write(process.euid(), process.egid(), process.extra_gids());
  569. }
  570. inline bool InodeMetadata::may_execute(const Process& process) const
  571. {
  572. return may_execute(process.euid(), process.egid(), process.extra_gids());
  573. }
  574. inline ProcessID Thread::pid() const
  575. {
  576. return m_process->pid();
  577. }
  578. inline const LogStream& operator<<(const LogStream& stream, const Process& process)
  579. {
  580. return stream << process.name() << '(' << process.pid().value() << ')';
  581. }
  582. #define REQUIRE_NO_PROMISES \
  583. do { \
  584. if (Process::current()->has_promises()) { \
  585. dbgln("Has made a promise"); \
  586. Process::current()->crash(SIGABRT, 0); \
  587. VERIFY_NOT_REACHED(); \
  588. } \
  589. } while (0)
  590. #define REQUIRE_PROMISE(promise) \
  591. do { \
  592. if (Process::current()->has_promises() \
  593. && !Process::current()->has_promised(Pledge::promise)) { \
  594. dbgln("Has not pledged {}", #promise); \
  595. Process::current()->coredump_metadata().set( \
  596. "pledge_violation", #promise); \
  597. Process::current()->crash(SIGABRT, 0); \
  598. VERIFY_NOT_REACHED(); \
  599. } \
  600. } while (0)
  601. }
  602. inline static String copy_string_from_user(const Kernel::Syscall::StringArgument& string)
  603. {
  604. return copy_string_from_user(string.characters, string.length);
  605. }
  606. template<>
  607. struct AK::Formatter<Kernel::Process> : AK::Formatter<String> {
  608. void format(FormatBuilder& builder, const Kernel::Process& value)
  609. {
  610. return AK::Formatter<String>::format(builder, String::formatted("{}({})", value.name(), value.pid().value()));
  611. }
  612. };