Subject: Re: CVS commit: src/sys
To: YAMAMOTO Takashi <yamt@mwd.biglobe.ne.jp>
From: Christos Zoulas <christos@zoulas.com>
List: source-changes
Date: 12/26/2007 10:43:01
On Dec 26,  9:00pm, yamt@mwd.biglobe.ne.jp (YAMAMOTO Takashi) wrote:
-- Subject: Re: CVS commit: src/sys

| > Module Name:	src
| > Committed By:	christos
| > Date:		Mon Dec  3 02:06:59 UTC 2007
| > 
| > Modified Files:
| > 	src/sys/kern: exec_conf.c exec_elf32.c kern_exec.c vfs_getcwd.c
| > 	src/sys/sys: exec.h exec_elf.h filedesc.h
| > 
| > Log Message:
| > - add an elf aux vector entry for implementing $ORIGIN.
| > - the code to convert from a vnode to a path is commented out now until
| >   a better solution is implemented. Only absolute paths work for now
| >   (which is most of the cases).
| > 
| > requested by core
| > 
| > 
| > To generate a diff of this commit:
| > cvs rdiff -r1.93 -r1.94 src/sys/kern/exec_conf.c
| > cvs rdiff -r1.126 -r1.127 src/sys/kern/exec_elf32.c
| > cvs rdiff -r1.254 -r1.255 src/sys/kern/kern_exec.c
| > cvs rdiff -r1.38 -r1.39 src/sys/kern/vfs_getcwd.c
| > cvs rdiff -r1.117 -r1.118 src/sys/sys/exec.h
| > cvs rdiff -r1.91 -r1.92 src/sys/sys/exec_elf.h
| > cvs rdiff -r1.42 -r1.43 src/sys/sys/filedesc.h
| > 
| > Please note that diffs are not public domain; they are subject to the
| > copyright notices on the relevant files.
| 
| can you avoid the MAXPATHLEN-sized buffer on kernel stack?

You mean this one? I did not put it there; it was there before for systrace.

christos

Index: kern_exec.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_exec.c,v
retrieving revision 1.258
diff -u -u -r1.258 kern_exec.c
--- kern_exec.c	20 Dec 2007 23:03:08 -0000	1.258
+++ kern_exec.c	26 Dec 2007 15:41:27 -0000
@@ -431,7 +434,7 @@
 	struct exec_vmcmd	*base_vcp;
 	ksiginfo_t		ksi;
 	ksiginfoq_t		kq;
-	char			pathbuf[MAXPATHLEN];
+	char			*pathbuf;
 	size_t			pathbuflen;
 #ifdef SYSTRACE
 	int			wassugid = ISSET(p->p_flag, PK_SUGID);
@@ -460,7 +463,8 @@
 		systrace_execve0(p);
 #endif
 
-	error = copyinstr(path, pathbuf, sizeof(pathbuf), &pathbuflen);
+	pathbuf = PNBUF_GET();
+	error = copyinstr(path, pathbuf, MAXPATHLEN, &pathbuflen);
 	if (error) {
 		DPRINTF(("execve: copyinstr path %d", error));
 		goto clrflg;
@@ -495,7 +499,8 @@
 
 	/* see if we can run it. */
 	if ((error = check_exec(l, &pack)) != 0) {
-		DPRINTF(("execve: check exec failed %d\n", error));
+		if (error != ENOENT)
+			DPRINTF(("execve: check exec failed %d\n", error));
 		goto freehdr;
 	}
 
@@ -1027,6 +1036,7 @@
 		systrace_execve1(pathbuf, p);
 #endif /* SYSTRACE */
 
+	PNBUF_PUT(pathbuf);
 	return (EJUSTRETURN);
 
  bad:
@@ -1052,6 +1062,7 @@
 		vrele(pack.ep_interp);
 
  clrflg:
+	PNBUF_PUT(pathbuf);
 	rw_exit(&p->p_reflock);
 #ifdef LKM
 	rw_exit(&exec_lock);
@@ -1060,6 +1071,7 @@
 	return error;
 
  exec_abort:
+	PNBUF_PUT(pathbuf);
 	rw_exit(&p->p_reflock);
 #ifdef LKM
 	rw_exit(&exec_lock);