Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F108582377
D33703.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D33703.diff
View Options
diff --git a/sys/amd64/linux/linux_sysvec.c b/sys/amd64/linux/linux_sysvec.c
--- a/sys/amd64/linux/linux_sysvec.c
+++ b/sys/amd64/linux/linux_sysvec.c
@@ -358,17 +358,12 @@
size_t execpath_len;
struct proc *p;
- /* Calculate string base and vector table pointers. */
- if (imgp->execpath != NULL && imgp->auxargs != NULL)
- execpath_len = strlen(imgp->execpath) + 1;
- else
- execpath_len = 0;
-
p = imgp->proc;
arginfo = (struct ps_strings *)p->p_sysent->sv_psstrings;
destp = (uintptr_t)arginfo;
- if (execpath_len != 0) {
+ if (imgp->execpath != NULL && imgp->auxargs != NULL) {
+ execpath_len = strlen(imgp->execpath) + 1;
destp -= execpath_len;
destp = rounddown2(destp, sizeof(void *));
imgp->execpathp = (void *)destp;
diff --git a/sys/amd64/linux32/linux32_sysvec.c b/sys/amd64/linux32/linux32_sysvec.c
--- a/sys/amd64/linux32/linux32_sysvec.c
+++ b/sys/amd64/linux32/linux32_sysvec.c
@@ -771,16 +771,11 @@
char canary[LINUX_AT_RANDOM_LEN];
size_t execpath_len;
- /* Calculate string base and vector table pointers. */
- if (imgp->execpath != NULL && imgp->auxargs != NULL)
- execpath_len = strlen(imgp->execpath) + 1;
- else
- execpath_len = 0;
-
arginfo = (struct linux32_ps_strings *)LINUX32_PS_STRINGS;
destp = (uintptr_t)arginfo;
- if (execpath_len != 0) {
+ if (imgp->execpath != NULL && imgp->auxargs != NULL) {
+ execpath_len = strlen(imgp->execpath) + 1;
destp -= execpath_len;
destp = rounddown2(destp, sizeof(uint32_t));
imgp->execpathp = (void *)destp;
diff --git a/sys/arm64/linux/linux_sysvec.c b/sys/arm64/linux/linux_sysvec.c
--- a/sys/arm64/linux/linux_sysvec.c
+++ b/sys/arm64/linux/linux_sysvec.c
@@ -255,17 +255,12 @@
struct proc *p;
int argc, envc, error;
- /* Calculate string base and vector table pointers. */
- if (imgp->execpath != NULL && imgp->auxargs != NULL)
- execpath_len = strlen(imgp->execpath) + 1;
- else
- execpath_len = 0;
-
p = imgp->proc;
arginfo = (struct ps_strings *)p->p_sysent->sv_psstrings;
destp = (uintptr_t)arginfo;
- if (execpath_len != 0) {
+ if (imgp->execpath != NULL && imgp->auxargs != NULL) {
+ execpath_len = strlen(imgp->execpath) + 1;
destp -= execpath_len;
destp = rounddown2(destp, sizeof(void *));
imgp->execpathp = (void *)destp;
diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c
--- a/sys/compat/freebsd32/freebsd32_misc.c
+++ b/sys/compat/freebsd32/freebsd32_misc.c
@@ -3391,6 +3391,7 @@
int
freebsd32_copyout_strings(struct image_params *imgp, uintptr_t *stack_base)
{
+ struct sysentvec *sysent;
int argc, envc, i;
uint32_t *vectp;
char *stringp;
@@ -3401,30 +3402,20 @@
size_t execpath_len;
int error, szsigcode;
- /*
- * Calculate string base and vector table pointers.
- * Also deal with signal trampoline code for this exec type.
- */
- if (imgp->execpath != NULL && imgp->auxargs != NULL)
- execpath_len = strlen(imgp->execpath) + 1;
- else
- execpath_len = 0;
- arginfo = (struct freebsd32_ps_strings *)curproc->p_sysent->
- sv_psstrings;
+ sysent = imgp->sysent;
+
+ arginfo = (struct freebsd32_ps_strings *)sysent->sv_psstrings;
imgp->ps_strings = arginfo;
- if (imgp->proc->p_sysent->sv_sigcode_base == 0)
- szsigcode = *(imgp->proc->p_sysent->sv_szsigcode);
- else
- szsigcode = 0;
destp = (uintptr_t)arginfo;
/*
- * install sigcode
+ * Install sigcode.
*/
- if (szsigcode != 0) {
+ if (sysent->sv_sigcode_base == 0) {
+ szsigcode = *sysent->sv_szsigcode;
destp -= szsigcode;
destp = rounddown2(destp, sizeof(uint32_t));
- error = copyout(imgp->proc->p_sysent->sv_sigcode, (void *)destp,
+ error = copyout(sysent->sv_sigcode, (void *)destp,
szsigcode);
if (error != 0)
return (error);
@@ -3433,7 +3424,8 @@
/*
* Copy the image path for the rtld.
*/
- if (execpath_len != 0) {
+ if (imgp->execpath != NULL && imgp->auxargs != NULL) {
+ execpath_len = strlen(imgp->execpath) + 1;
destp -= execpath_len;
imgp->execpathp = (void *)destp;
error = copyout(imgp->execpath, imgp->execpathp, execpath_len);
diff --git a/sys/i386/linux/linux_sysvec.c b/sys/i386/linux/linux_sysvec.c
--- a/sys/i386/linux/linux_sysvec.c
+++ b/sys/i386/linux/linux_sysvec.c
@@ -289,16 +289,12 @@
size_t execpath_len;
struct proc *p;
- /* Calculate string base and vector table pointers. */
p = imgp->proc;
- if (imgp->execpath != NULL && imgp->auxargs != NULL)
- execpath_len = strlen(imgp->execpath) + 1;
- else
- execpath_len = 0;
arginfo = (struct ps_strings *)p->p_sysent->sv_psstrings;
destp = (uintptr_t)arginfo;
- if (execpath_len != 0) {
+ if (imgp->execpath != NULL && imgp->auxargs != NULL) {
+ execpath_len = strlen(imgp->execpath) + 1;
destp -= execpath_len;
destp = rounddown2(destp, sizeof(void *));
imgp->execpathp = (void *)destp;
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -1616,37 +1616,26 @@
uintptr_t destp, ustringp;
struct ps_strings *arginfo;
struct proc *p;
+ struct sysentvec *sysent;
size_t execpath_len;
- int error, szsigcode, szps;
+ int error, szsigcode;
char canary[sizeof(long) * 8];
- szps = sizeof(pagesizes[0]) * MAXPAGESIZES;
- /*
- * Calculate string base and vector table pointers.
- * Also deal with signal trampoline code for this exec type.
- */
- if (imgp->execpath != NULL && imgp->auxargs != NULL)
- execpath_len = strlen(imgp->execpath) + 1;
- else
- execpath_len = 0;
p = imgp->proc;
- szsigcode = 0;
- arginfo = (struct ps_strings *)p->p_sysent->sv_psstrings;
- imgp->ps_strings = arginfo;
- if (p->p_sysent->sv_sigcode_base == 0) {
- if (p->p_sysent->sv_szsigcode != NULL)
- szsigcode = *(p->p_sysent->sv_szsigcode);
- }
+ sysent = p->p_sysent;
+
+ arginfo = (struct ps_strings *)sysent->sv_psstrings;
destp = (uintptr_t)arginfo;
+ imgp->ps_strings = arginfo;
/*
- * install sigcode
+ * Install sigcode.
*/
- if (szsigcode != 0) {
+ if (sysent->sv_sigcode_base == 0 && sysent->sv_szsigcode != NULL) {
+ szsigcode = *(sysent->sv_szsigcode);
destp -= szsigcode;
destp = rounddown2(destp, sizeof(void *));
- error = copyout(p->p_sysent->sv_sigcode, (void *)destp,
- szsigcode);
+ error = copyout(sysent->sv_sigcode, (void *)destp, szsigcode);
if (error != 0)
return (error);
}
@@ -1654,7 +1643,8 @@
/*
* Copy the image path for the rtld.
*/
- if (execpath_len != 0) {
+ if (imgp->execpath != NULL && imgp->auxargs != NULL) {
+ execpath_len = strlen(imgp->execpath) + 1;
destp -= execpath_len;
destp = rounddown2(destp, sizeof(void *));
imgp->execpathp = (void *)destp;
@@ -1677,13 +1667,13 @@
/*
* Prepare the pagesizes array.
*/
- destp -= szps;
+ imgp->pagesizeslen = sizeof(pagesizes[0]) * MAXPAGESIZES;
+ destp -= imgp->pagesizeslen;
destp = rounddown2(destp, sizeof(void *));
imgp->pagesizes = (void *)destp;
- error = copyout(pagesizes, imgp->pagesizes, szps);
+ error = copyout(pagesizes, imgp->pagesizes, imgp->pagesizeslen);
if (error != 0)
return (error);
- imgp->pagesizeslen = szps;
/*
* Allocate room for the argument and environment strings.
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Jan 27, 2:56 PM (5 h, 26 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16199586
Default Alt Text
D33703.diff (6 KB)
Attached To
Mode
D33703: exec: Simplify sv_copyout_strings implementations a bit
Attached
Detach File
Event Timeline
Log In to Comment