Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_proc.c
Show First 20 Lines • Show All 1,832 Lines • ▼ Show 20 Lines | get_proc_vector32(struct thread *td, struct proc *p, char ***proc_vectorp, | ||||
Elf32_Auxinfo aux; | Elf32_Auxinfo aux; | ||||
vm_offset_t vptr, ptr; | vm_offset_t vptr, ptr; | ||||
uint32_t *proc_vector32; | uint32_t *proc_vector32; | ||||
char **proc_vector; | char **proc_vector; | ||||
size_t vsize, size; | size_t vsize, size; | ||||
int i, error; | int i, error; | ||||
error = 0; | error = 0; | ||||
if (proc_readmem(td, p, (vm_offset_t)p->p_sysent->sv_psstrings, &pss, | if (proc_readmem(td, p, PROC_PS_STRINGS(p), &pss, sizeof(pss)) != | ||||
sizeof(pss)) != sizeof(pss)) | sizeof(pss)) | ||||
return (ENOMEM); | return (ENOMEM); | ||||
switch (type) { | switch (type) { | ||||
case PROC_ARG: | case PROC_ARG: | ||||
vptr = (vm_offset_t)PTRIN(pss.ps_argvstr); | vptr = (vm_offset_t)PTRIN(pss.ps_argvstr); | ||||
vsize = pss.ps_nargvstr; | vsize = pss.ps_nargvstr; | ||||
if (vsize > ARG_MAX) | if (vsize > ARG_MAX) | ||||
return (ENOEXEC); | return (ENOEXEC); | ||||
size = vsize * sizeof(int32_t); | size = vsize * sizeof(int32_t); | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | get_proc_vector(struct thread *td, struct proc *p, char ***proc_vectorp, | ||||
char **proc_vector; | char **proc_vector; | ||||
size_t vsize, size; | size_t vsize, size; | ||||
int i; | int i; | ||||
#ifdef COMPAT_FREEBSD32 | #ifdef COMPAT_FREEBSD32 | ||||
if (SV_PROC_FLAG(p, SV_ILP32) != 0) | if (SV_PROC_FLAG(p, SV_ILP32) != 0) | ||||
return (get_proc_vector32(td, p, proc_vectorp, vsizep, type)); | return (get_proc_vector32(td, p, proc_vectorp, vsizep, type)); | ||||
#endif | #endif | ||||
if (proc_readmem(td, p, (vm_offset_t)p->p_sysent->sv_psstrings, &pss, | if (proc_readmem(td, p, PROC_PS_STRINGS(p), &pss, sizeof(pss)) != | ||||
sizeof(pss)) != sizeof(pss)) | sizeof(pss)) | ||||
return (ENOMEM); | return (ENOMEM); | ||||
switch (type) { | switch (type) { | ||||
case PROC_ARG: | case PROC_ARG: | ||||
vptr = (vm_offset_t)pss.ps_argvstr; | vptr = (vm_offset_t)pss.ps_argvstr; | ||||
vsize = pss.ps_nargvstr; | vsize = pss.ps_nargvstr; | ||||
if (vsize > ARG_MAX) | if (vsize > ARG_MAX) | ||||
return (ENOEXEC); | return (ENOEXEC); | ||||
size = vsize * sizeof(char *); | size = vsize * sizeof(char *); | ||||
▲ Show 20 Lines • Show All 1,048 Lines • ▼ Show 20 Lines | if (error != 0) | ||||
return (error); | return (error); | ||||
#ifdef COMPAT_FREEBSD32 | #ifdef COMPAT_FREEBSD32 | ||||
if ((req->flags & SCTL_MASK32) != 0) { | if ((req->flags & SCTL_MASK32) != 0) { | ||||
/* | /* | ||||
* We return 0 if the 32 bit emulation request is for a 64 bit | * We return 0 if the 32 bit emulation request is for a 64 bit | ||||
* process. | * process. | ||||
*/ | */ | ||||
ps_strings32 = SV_PROC_FLAG(p, SV_ILP32) != 0 ? | ps_strings32 = SV_PROC_FLAG(p, SV_ILP32) != 0 ? | ||||
PTROUT(p->p_sysent->sv_psstrings) : 0; | PTROUT(PROC_PS_STRINGS(p)) : 0; | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
error = SYSCTL_OUT(req, &ps_strings32, sizeof(ps_strings32)); | error = SYSCTL_OUT(req, &ps_strings32, sizeof(ps_strings32)); | ||||
return (error); | return (error); | ||||
} | } | ||||
#endif | #endif | ||||
ps_strings = p->p_sysent->sv_psstrings; | ps_strings = PROC_PS_STRINGS(p); | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
error = SYSCTL_OUT(req, &ps_strings, sizeof(ps_strings)); | error = SYSCTL_OUT(req, &ps_strings, sizeof(ps_strings)); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* This sysctl allows a process to retrieve umask of another process. | * This sysctl allows a process to retrieve umask of another process. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 100 Lines • ▼ Show 20 Lines | if ((req->flags & SCTL_MASK32) != 0) { | ||||
if (SV_PROC_FLAG(p, SV_ILP32)) { | if (SV_PROC_FLAG(p, SV_ILP32)) { | ||||
if (sv->sv_sigcode_base != 0) { | if (sv->sv_sigcode_base != 0) { | ||||
kst32.ksigtramp_start = sv->sv_sigcode_base; | kst32.ksigtramp_start = sv->sv_sigcode_base; | ||||
kst32.ksigtramp_end = sv->sv_sigcode_base + | kst32.ksigtramp_end = sv->sv_sigcode_base + | ||||
((sv->sv_flags & SV_DSO_SIG) == 0 ? | ((sv->sv_flags & SV_DSO_SIG) == 0 ? | ||||
*sv->sv_szsigcode : | *sv->sv_szsigcode : | ||||
(uintptr_t)sv->sv_szsigcode); | (uintptr_t)sv->sv_szsigcode); | ||||
} else { | } else { | ||||
kst32.ksigtramp_start = sv->sv_psstrings - | kst32.ksigtramp_start = PROC_PS_STRINGS(p) - | ||||
*sv->sv_szsigcode; | *sv->sv_szsigcode; | ||||
kst32.ksigtramp_end = sv->sv_psstrings; | kst32.ksigtramp_end = PROC_PS_STRINGS(p); | ||||
} | } | ||||
} | } | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
error = SYSCTL_OUT(req, &kst32, sizeof(kst32)); | error = SYSCTL_OUT(req, &kst32, sizeof(kst32)); | ||||
return (error); | return (error); | ||||
} | } | ||||
#endif | #endif | ||||
bzero(&kst, sizeof(kst)); | bzero(&kst, sizeof(kst)); | ||||
if (sv->sv_sigcode_base != 0) { | if (sv->sv_sigcode_base != 0) { | ||||
kst.ksigtramp_start = (char *)sv->sv_sigcode_base; | kst.ksigtramp_start = (char *)sv->sv_sigcode_base; | ||||
kst.ksigtramp_end = (char *)sv->sv_sigcode_base + | kst.ksigtramp_end = (char *)sv->sv_sigcode_base + | ||||
((sv->sv_flags & SV_DSO_SIG) == 0 ? *sv->sv_szsigcode : | ((sv->sv_flags & SV_DSO_SIG) == 0 ? *sv->sv_szsigcode : | ||||
(uintptr_t)sv->sv_szsigcode); | (uintptr_t)sv->sv_szsigcode); | ||||
} else { | } else { | ||||
kst.ksigtramp_start = (char *)sv->sv_psstrings - | kst.ksigtramp_start = (char *)PROC_PS_STRINGS(p) - | ||||
*sv->sv_szsigcode; | *sv->sv_szsigcode; | ||||
kst.ksigtramp_end = (char *)sv->sv_psstrings; | kst.ksigtramp_end = (char *)PROC_PS_STRINGS(p); | ||||
} | } | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
error = SYSCTL_OUT(req, &kst, sizeof(kst)); | error = SYSCTL_OUT(req, &kst, sizeof(kst)); | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
sysctl_kern_proc_sigfastblk(SYSCTL_HANDLER_ARGS) | sysctl_kern_proc_sigfastblk(SYSCTL_HANDLER_ARGS) | ||||
▲ Show 20 Lines • Show All 326 Lines • Show Last 20 Lines |