Serenity Operating System
at master 31 lines 967 B view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <Kernel/Process.h> 8#include <Kernel/Random.h> 9#include <Kernel/UserOrKernelBuffer.h> 10 11namespace Kernel { 12 13// We don't use the flag yet, but we could use it for distinguishing 14// random source like Linux, unlike the OpenBSD equivalent. However, if we 15// do, we should be able of the caveats that Linux has dealt with. 16ErrorOr<FlatPtr> Process::sys$getrandom(Userspace<void*> buffer, size_t buffer_size, [[maybe_unused]] unsigned flags) 17{ 18 VERIFY_NO_PROCESS_BIG_LOCK(this); 19 TRY(require_promise(Pledge::stdio)); 20 if (buffer_size > NumericLimits<ssize_t>::max()) 21 return EINVAL; 22 23 auto data_buffer = TRY(UserOrKernelBuffer::for_user_buffer(buffer, buffer_size)); 24 25 return TRY(data_buffer.write_buffered<1024>(buffer_size, [&](Bytes bytes) { 26 get_good_random_bytes(bytes); 27 return bytes.size(); 28 })); 29} 30 31}