Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 28 Nov 1997 19:23:34 +0900 (JST)
From:      kagotani@in.it.okayama-u.ac.jp
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   bin/5172: [2.2.5] /bin/sh dumps core
Message-ID:  <199711281023.TAA02509@loach.in.it.okayama-u.ac.jp>
Resent-Message-ID: <199711281030.CAA06390@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         5172
>Category:       bin
>Synopsis:       /bin/sh dumps core when exec'ing a bogus script
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Nov 28 02:30:00 PST 1997
>Last-Modified:
>Originator:     Hiroto Kagotani
>Organization:
Okayama University, Japan
>Release:        FreeBSD 2.2.5-RELEASE i386
>Environment:

On the console or on any terminal emulator running any shell.

>Description:

If the interpreter of an executable script does not exist,
and the directory containing the script is not the last part of PATH
variable, then /bin/sh dumps core when exec'int the script.

>How-To-Repeat:

Create two executable scripts named "a" and "b" as follows:

--- a ---
#!/bin/sh
PATH=.:/bin
b
---------
--- b ---
#!/no/such/file
---------

And type "./a" in your shell.  Then, you will get:

% ./a
Segmentation fault - core dumped
%

>Fix:
	
shellexec() in /bin/sh assumes that tryexec() does not change argv[0].
But execve(2) called in tryexec() changes it.
(I'm not sure whether this is a spec or a bug of execve(2).)

So, my sample fix preserves argv[0] before calling execve(2),
and restores it after.

---------
diff -u /usr/src/bin/sh/exec.c ./exec.c
--- /usr/src/bin/sh/exec.c	Mon Aug 25 18:09:46 1997
+++ ./exec.c	Fri Nov 28 18:17:22 1997
@@ -164,6 +164,7 @@
 	char *p;
 #endif
 
+	char *argv0 = argv[0];
 #ifdef SYSV
 	do {
 		execve(cmd, argv, envp);
@@ -171,6 +172,7 @@
 #else
 	execve(cmd, argv, envp);
 #endif
+	argv[0] = argv0;
 	e = errno;
 	if (e == ENOEXEC) {
 		initshellproc();
---------
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199711281023.TAA02509>