Serenity Operating System
at master 58 lines 2.1 kB view raw
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}