svn commit: r197820 - in head: bin/sh tools/regression/bin/sh/execution

Jilles Tjoelker jilles at FreeBSD.org
Tue Oct 6 22:00:15 UTC 2009


Author: jilles
Date: Tue Oct  6 22:00:14 2009
New Revision: 197820
URL: http://svn.freebsd.org/changeset/base/197820

Log:
  sh: Send the "xyz: not found" message to redirected fd 2.
  This also fixes that trying to execute a non-regular file with a command
  name without '/' returns 127 instead of 126.
  The fix is rather simplistic: treat CMDUNKNOWN as if the command were found
  as an external program. The resulting fork is a bit wasteful but executing
  unknown commands should not be very frequent.
  
  PR:		bin/137659

Added:
  head/tools/regression/bin/sh/execution/unknown1.0   (contents, props changed)
Modified:
  head/bin/sh/eval.c
  head/bin/sh/exec.c

Modified: head/bin/sh/eval.c
==============================================================================
--- head/bin/sh/eval.c	Tue Oct  6 21:49:13 2009	(r197819)
+++ head/bin/sh/eval.c	Tue Oct  6 22:00:14 2009	(r197820)
@@ -713,12 +713,7 @@ evalcommand(union node *cmd, int flags, 
 				do_clearcmdentry = 1;
 			}
 
-		find_command(argv[0], &cmdentry, 1, path);
-		if (cmdentry.cmdtype == CMDUNKNOWN) {	/* command not found */
-			exitstatus = 127;
-			flushout(&errout);
-			return;
-		}
+		find_command(argv[0], &cmdentry, 0, path);
 		/* implement the bltin builtin here */
 		if (cmdentry.cmdtype == CMDBUILTIN && cmdentry.u.index == BLTINCMD) {
 			for (;;) {
@@ -740,7 +735,7 @@ evalcommand(union node *cmd, int flags, 
 
 	/* Fork off a child process if necessary. */
 	if (cmd->ncmd.backgnd
-	 || (cmdentry.cmdtype == CMDNORMAL
+	 || ((cmdentry.cmdtype == CMDNORMAL || cmdentry.cmdtype == CMDUNKNOWN)
 	    && ((flags & EV_EXIT) == 0 || have_traps()))
 	 || ((flags & EV_BACKCMD) != 0
 	    && (cmdentry.cmdtype != CMDBUILTIN

Modified: head/bin/sh/exec.c
==============================================================================
--- head/bin/sh/exec.c	Tue Oct  6 21:49:13 2009	(r197819)
+++ head/bin/sh/exec.c	Tue Oct  6 22:00:14 2009	(r197820)
@@ -429,6 +429,7 @@ loop:
 			outfmt(out2, "%s: %s\n", name, strerror(e));
 	}
 	entry->cmdtype = CMDUNKNOWN;
+	entry->u.index = 0;
 	return;
 
 success:

Added: head/tools/regression/bin/sh/execution/unknown1.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/bin/sh/execution/unknown1.0	Tue Oct  6 22:00:14 2009	(r197820)
@@ -0,0 +1,29 @@
+# $FreeBSD$
+
+nosuchtool 2>/dev/null
+[ $? -ne 127 ] && exit 1
+/var/empty/nosuchtool 2>/dev/null
+[ $? -ne 127 ] && exit 1
+(nosuchtool) 2>/dev/null
+[ $? -ne 127 ] && exit 1
+(/var/empty/nosuchtool) 2>/dev/null
+[ $? -ne 127 ] && exit 1
+/ 2>/dev/null
+[ $? -ne 126 ] && exit 1
+PATH=/usr bin 2>/dev/null
+[ $? -ne 126 ] && exit 1
+
+dummy=$(nosuchtool 2>/dev/null)
+[ $? -ne 127 ] && exit 1
+dummy=$(/var/empty/nosuchtool 2>/dev/null)
+[ $? -ne 127 ] && exit 1
+dummy=$( (nosuchtool) 2>/dev/null)
+[ $? -ne 127 ] && exit 1
+dummy=$( (/var/empty/nosuchtool) 2>/dev/null)
+[ $? -ne 127 ] && exit 1
+dummy=$(/ 2>/dev/null)
+[ $? -ne 126 ] && exit 1
+dummy=$(PATH=/usr bin 2>/dev/null)
+[ $? -ne 126 ] && exit 1
+
+exit 0


More information about the svn-src-all mailing list