diff options
author | Kornel Dulęba <kd@FreeBSD.org> | 2022-06-02 07:58:12 +0000 |
---|---|---|
committer | Kornel Dulęba <kd@FreeBSD.org> | 2022-07-18 14:27:32 +0000 |
commit | 361971fbca5fdb8121dd4d05119d81269af78ea7 (patch) | |
tree | 19256d2ffea2eaee1955f7cf83006300cbeaeab7 /sys/kern/imgact_elf.c | |
parent | f6ac79fb12f3c7ad891849d6721a20a100f6a9a9 (diff) | |
download | src-361971fbca5fdb8121dd4d05119d81269af78ea7.tar.gz src-361971fbca5fdb8121dd4d05119d81269af78ea7.zip |
Rework how shared page related data is stored
Store the shared page address in struct vmspace.
Also instead of storing absolute addresses of various shared page
segments save their offsets with respect to the shared page address.
This will be more useful when the shared page address is randomized.
Approved by: mw(mentor)
Sponsored by: Stormshield
Obtained from: Semihalf
Reviewed by: kib
Differential Revision: https://reviews.freebsd.org/D35393
Diffstat (limited to 'sys/kern/imgact_elf.c')
-rw-r--r-- | sys/kern/imgact_elf.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index 964e9c999d60..c71b00337027 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -1433,11 +1433,14 @@ __elfN(freebsd_copyout_auxargs)(struct image_params *imgp, uintptr_t base) { Elf_Auxargs *args = (Elf_Auxargs *)imgp->auxargs; Elf_Auxinfo *argarray, *pos; + struct vmspace *vmspace; int error; argarray = pos = malloc(AT_COUNT * sizeof(*pos), M_TEMP, M_WAITOK | M_ZERO); + vmspace = imgp->proc->p_vmspace; + if (args->execfd != -1) AUXARGS_ENTRY(pos, AT_EXECFD, args->execfd); AUXARGS_ENTRY(pos, AT_PHDR, args->phdr); @@ -1461,9 +1464,9 @@ __elfN(freebsd_copyout_auxargs)(struct image_params *imgp, uintptr_t base) AUXARGS_ENTRY_PTR(pos, AT_PAGESIZES, imgp->pagesizes); AUXARGS_ENTRY(pos, AT_PAGESIZESLEN, imgp->pagesizeslen); } - if (imgp->sysent->sv_timekeep_base != 0) { + if ((imgp->sysent->sv_flags & SV_TIMEKEEP) != 0) { AUXARGS_ENTRY(pos, AT_TIMEKEEP, - imgp->sysent->sv_timekeep_base); + vmspace->vm_shp_base + imgp->sysent->sv_timekeep_offset); } AUXARGS_ENTRY(pos, AT_STACKPROT, imgp->sysent->sv_shared_page_obj != NULL && imgp->stack_prot != 0 ? imgp->stack_prot : @@ -1479,10 +1482,16 @@ __elfN(freebsd_copyout_auxargs)(struct image_params *imgp, uintptr_t base) AUXARGS_ENTRY(pos, AT_ENVC, imgp->args->envc); AUXARGS_ENTRY_PTR(pos, AT_ENVV, imgp->envv); AUXARGS_ENTRY_PTR(pos, AT_PS_STRINGS, imgp->ps_strings); - if (imgp->sysent->sv_fxrng_gen_base != 0) - AUXARGS_ENTRY(pos, AT_FXRNG, imgp->sysent->sv_fxrng_gen_base); - if (imgp->sysent->sv_vdso_base != 0 && __elfN(vdso) != 0) - AUXARGS_ENTRY(pos, AT_KPRELOAD, imgp->sysent->sv_vdso_base); +#ifdef RANDOM_FENESTRASX + if ((imgp->sysent->sv_flags & SV_RNG_SEED_VER) != 0) { + AUXARGS_ENTRY(pos, AT_FXRNG, + vmspace->vm_shp_base + imgp->sysent->sv_fxrng_gen_offset); + } +#endif + if ((imgp->sysent->sv_flags & SV_DSO_SIG) != 0 && __elfN(vdso) != 0) { + AUXARGS_ENTRY(pos, AT_KPRELOAD, + vmspace->vm_shp_base + imgp->sysent->sv_vdso_offset); + } AUXARGS_ENTRY(pos, AT_NULL, 0); free(imgp->auxargs, M_TEMP); |