mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 15:17:45 +00:00
Kernel: Use TRY() more in sys$execve()
I just keep finding more and more places to make use of this. :^)
This commit is contained in:
parent
009ea5013d
commit
6863d015ec
1 changed files with 17 additions and 36 deletions
|
@ -209,20 +209,14 @@ static KResultOr<FlatPtr> get_load_offset(const ElfW(Ehdr) & main_program_header
|
||||||
if (main_program_header.e_type != ET_EXEC)
|
if (main_program_header.e_type != ET_EXEC)
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
auto main_program_load_range_result = get_required_load_range(main_program_description);
|
auto main_program_load_range = TRY(get_required_load_range(main_program_description));
|
||||||
if (main_program_load_range_result.is_error())
|
|
||||||
return main_program_load_range_result.error();
|
|
||||||
|
|
||||||
auto main_program_load_range = main_program_load_range_result.value();
|
|
||||||
|
|
||||||
RequiredLoadRange selected_range {};
|
RequiredLoadRange selected_range {};
|
||||||
|
|
||||||
if (interpreter_description) {
|
if (interpreter_description) {
|
||||||
auto interpreter_load_range_result = get_required_load_range(*interpreter_description);
|
auto interpreter_load_range = TRY(get_required_load_range(*interpreter_description));
|
||||||
if (interpreter_load_range_result.is_error())
|
|
||||||
return interpreter_load_range_result.error();
|
|
||||||
|
|
||||||
auto interpreter_size_in_memory = interpreter_load_range_result.value().end - interpreter_load_range_result.value().start;
|
auto interpreter_size_in_memory = interpreter_load_range.end - interpreter_load_range.start;
|
||||||
auto interpreter_load_range_end = load_range_start + load_range_size - interpreter_size_in_memory;
|
auto interpreter_load_range_end = load_range_start + load_range_size - interpreter_size_in_memory;
|
||||||
|
|
||||||
// No intersection
|
// No intersection
|
||||||
|
@ -443,32 +437,22 @@ KResultOr<LoadResult> Process::load(NonnullRefPtr<FileDescription> main_program_
|
||||||
Memory::MemoryManager::enter_process_paging_scope(*this);
|
Memory::MemoryManager::enter_process_paging_scope(*this);
|
||||||
});
|
});
|
||||||
|
|
||||||
auto load_offset = get_load_offset(main_program_header, main_program_description, interpreter_description);
|
auto load_offset = TRY(get_load_offset(main_program_header, main_program_description, interpreter_description));
|
||||||
if (load_offset.is_error()) {
|
|
||||||
return load_offset.error();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (interpreter_description.is_null()) {
|
if (interpreter_description.is_null()) {
|
||||||
auto result = load_elf_object(move(new_space), main_program_description, load_offset.value(), ShouldAllocateTls::Yes, ShouldAllowSyscalls::No);
|
auto load_result = TRY(load_elf_object(move(new_space), main_program_description, load_offset, ShouldAllocateTls::Yes, ShouldAllowSyscalls::No));
|
||||||
if (result.is_error())
|
m_master_tls_region = load_result.tls_region;
|
||||||
return result.error();
|
m_master_tls_size = load_result.tls_size;
|
||||||
|
m_master_tls_alignment = load_result.tls_alignment;
|
||||||
m_master_tls_region = result.value().tls_region;
|
return load_result;
|
||||||
m_master_tls_size = result.value().tls_size;
|
|
||||||
m_master_tls_alignment = result.value().tls_alignment;
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto interpreter_load_result = load_elf_object(move(new_space), *interpreter_description, load_offset.value(), ShouldAllocateTls::No, ShouldAllowSyscalls::Yes);
|
auto interpreter_load_result = TRY(load_elf_object(move(new_space), *interpreter_description, load_offset, ShouldAllocateTls::No, ShouldAllowSyscalls::Yes));
|
||||||
|
|
||||||
if (interpreter_load_result.is_error())
|
|
||||||
return interpreter_load_result.error();
|
|
||||||
|
|
||||||
// TLS allocation will be done in userspace by the loader
|
// TLS allocation will be done in userspace by the loader
|
||||||
VERIFY(!interpreter_load_result.value().tls_region);
|
VERIFY(!interpreter_load_result.tls_region);
|
||||||
VERIFY(!interpreter_load_result.value().tls_alignment);
|
VERIFY(!interpreter_load_result.tls_alignment);
|
||||||
VERIFY(!interpreter_load_result.value().tls_size);
|
VERIFY(!interpreter_load_result.tls_size);
|
||||||
|
|
||||||
return interpreter_load_result;
|
return interpreter_load_result;
|
||||||
}
|
}
|
||||||
|
@ -877,9 +861,7 @@ KResult Process::exec(String path, Vector<String> arguments, Vector<String> envi
|
||||||
// are cleaned up by the time we yield-teleport below.
|
// are cleaned up by the time we yield-teleport below.
|
||||||
Thread* new_main_thread = nullptr;
|
Thread* new_main_thread = nullptr;
|
||||||
u32 prev_flags = 0;
|
u32 prev_flags = 0;
|
||||||
auto result = do_exec(move(description), move(arguments), move(environment), move(interpreter_description), new_main_thread, prev_flags, *main_program_header);
|
TRY(do_exec(move(description), move(arguments), move(environment), move(interpreter_description), new_main_thread, prev_flags, *main_program_header));
|
||||||
if (result.is_error())
|
|
||||||
return result;
|
|
||||||
|
|
||||||
VERIFY_INTERRUPTS_DISABLED();
|
VERIFY_INTERRUPTS_DISABLED();
|
||||||
VERIFY(Processor::in_critical());
|
VERIFY(Processor::in_critical());
|
||||||
|
@ -915,12 +897,11 @@ KResultOr<FlatPtr> Process::sys$execve(Userspace<const Syscall::SC_execve_params
|
||||||
if (params.arguments.length > ARG_MAX || params.environment.length > ARG_MAX)
|
if (params.arguments.length > ARG_MAX || params.environment.length > ARG_MAX)
|
||||||
return E2BIG;
|
return E2BIG;
|
||||||
|
|
||||||
|
// FIXME: This should use KString.
|
||||||
String path;
|
String path;
|
||||||
{
|
{
|
||||||
auto path_arg = get_syscall_path_argument(params.path);
|
auto path_arg = TRY(get_syscall_path_argument(params.path));
|
||||||
if (path_arg.is_error())
|
path = path_arg->view();
|
||||||
return path_arg.error();
|
|
||||||
path = path_arg.value()->view();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto copy_user_strings = [](const auto& list, auto& output) -> KResult {
|
auto copy_user_strings = [](const auto& list, auto& output) -> KResult {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue