Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_exec.c
Show All 31 Lines | |||||
#include "opt_capsicum.h" | #include "opt_capsicum.h" | ||||
#include "opt_hwpmc_hooks.h" | #include "opt_hwpmc_hooks.h" | ||||
#include "opt_ktrace.h" | #include "opt_ktrace.h" | ||||
#include "opt_vm.h" | #include "opt_vm.h" | ||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/systm.h> | #include <sys/systm.h> | ||||
#include <sys/acct.h> | #include <sys/acct.h> | ||||
#include <sys/asan.h> | |||||
#include <sys/capsicum.h> | #include <sys/capsicum.h> | ||||
#include <sys/eventhandler.h> | #include <sys/eventhandler.h> | ||||
#include <sys/exec.h> | #include <sys/exec.h> | ||||
#include <sys/fcntl.h> | #include <sys/fcntl.h> | ||||
#include <sys/filedesc.h> | #include <sys/filedesc.h> | ||||
#include <sys/imgact.h> | #include <sys/imgact.h> | ||||
#include <sys/imgact_elf.h> | #include <sys/imgact_elf.h> | ||||
#include <sys/kernel.h> | #include <sys/kernel.h> | ||||
▲ Show 20 Lines • Show All 1,275 Lines • ▼ Show 20 Lines | exec_alloc_args_kva(void **cookie) | ||||
if (argkva == NULL) { | if (argkva == NULL) { | ||||
mtx_lock(&exec_args_kva_mtx); | mtx_lock(&exec_args_kva_mtx); | ||||
while ((argkva = SLIST_FIRST(&exec_args_kva_freelist)) == NULL) | while ((argkva = SLIST_FIRST(&exec_args_kva_freelist)) == NULL) | ||||
(void)mtx_sleep(&exec_args_kva_freelist, | (void)mtx_sleep(&exec_args_kva_freelist, | ||||
&exec_args_kva_mtx, 0, "execkva", 0); | &exec_args_kva_mtx, 0, "execkva", 0); | ||||
SLIST_REMOVE_HEAD(&exec_args_kva_freelist, next); | SLIST_REMOVE_HEAD(&exec_args_kva_freelist, next); | ||||
mtx_unlock(&exec_args_kva_mtx); | mtx_unlock(&exec_args_kva_mtx); | ||||
} | } | ||||
kasan_mark((void *)argkva->addr, exec_map_entry_size, | |||||
exec_map_entry_size, 0); | |||||
*(struct exec_args_kva **)cookie = argkva; | *(struct exec_args_kva **)cookie = argkva; | ||||
return (argkva->addr); | return (argkva->addr); | ||||
} | } | ||||
static void | static void | ||||
exec_release_args_kva(struct exec_args_kva *argkva, u_int gen) | exec_release_args_kva(struct exec_args_kva *argkva, u_int gen) | ||||
{ | { | ||||
vm_offset_t base; | vm_offset_t base; | ||||
base = argkva->addr; | base = argkva->addr; | ||||
kasan_mark((void *)argkva->addr, 0, exec_map_entry_size, | |||||
KASAN_EXEC_ARGS_FREED); | |||||
if (argkva->gen != gen) { | if (argkva->gen != gen) { | ||||
(void)vm_map_madvise(exec_map, base, base + exec_map_entry_size, | (void)vm_map_madvise(exec_map, base, base + exec_map_entry_size, | ||||
MADV_FREE); | MADV_FREE); | ||||
argkva->gen = gen; | argkva->gen = gen; | ||||
} | } | ||||
if (!atomic_cmpset_ptr((uintptr_t *)DPCPU_PTR(exec_args_kva), | if (!atomic_cmpset_ptr((uintptr_t *)DPCPU_PTR(exec_args_kva), | ||||
(uintptr_t)NULL, (uintptr_t)argkva)) { | (uintptr_t)NULL, (uintptr_t)argkva)) { | ||||
mtx_lock(&exec_args_kva_mtx); | mtx_lock(&exec_args_kva_mtx); | ||||
▲ Show 20 Lines • Show All 516 Lines • Show Last 20 Lines |