Serenity Operating System
1/*
2 * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <Kernel/API/prctl_numbers.h>
8#include <Kernel/Process.h>
9
10namespace Kernel {
11
12ErrorOr<FlatPtr> Process::sys$prctl(int option, FlatPtr arg1, [[maybe_unused]] FlatPtr arg2)
13{
14 VERIFY_NO_PROCESS_BIG_LOCK(this);
15 return with_mutable_protected_data([&](auto& protected_data) -> ErrorOr<FlatPtr> {
16 switch (option) {
17 case PR_GET_DUMPABLE:
18 return protected_data.dumpable;
19 case PR_SET_DUMPABLE:
20 if (arg1 != 0 && arg1 != 1)
21 return EINVAL;
22 protected_data.dumpable = arg1;
23 return 0;
24 case PR_GET_NO_NEW_SYSCALL_REGION_ANNOTATIONS:
25 return address_space().with([&](auto& space) -> ErrorOr<FlatPtr> {
26 return space->enforces_syscall_regions();
27 });
28 case PR_SET_NO_NEW_SYSCALL_REGION_ANNOTATIONS: {
29 if (arg1 != 0 && arg1 != 1)
30 return EINVAL;
31 bool prohibit_new_annotated_syscall_regions = (arg1 == 1);
32 return address_space().with([&](auto& space) -> ErrorOr<FlatPtr> {
33 if (space->enforces_syscall_regions() && !prohibit_new_annotated_syscall_regions)
34 return EPERM;
35
36 space->set_enforces_syscall_regions(prohibit_new_annotated_syscall_regions);
37 return 0;
38 });
39 return 0;
40 }
41 case PR_SET_COREDUMP_METADATA_VALUE: {
42 auto params = TRY(copy_typed_from_user<Syscall::SC_set_coredump_metadata_params>(arg1));
43 if (params.key.length == 0 || params.key.length > 16 * KiB)
44 return EINVAL;
45 if (params.value.length > 16 * KiB)
46 return EINVAL;
47 auto key = TRY(try_copy_kstring_from_user(params.key));
48 auto value = TRY(try_copy_kstring_from_user(params.value));
49 TRY(set_coredump_property(move(key), move(value)));
50 return 0;
51 }
52 }
53
54 return EINVAL;
55 });
56}
57
58}