Date: 10 Nov 2000 20:15:44 -0000 From: mwm@mired.org To: FreeBSD-gnats-submit@freebsd.org Subject: kern/22755: Errors reports about the interpreter on scripts are bogus Message-ID: <20001110201544.45033.qmail@guru.mired.org>
next in thread | raw e-mail | index | archive | help
>Number: 22755
>Category: kern
>Synopsis: Errors reports about the interpreter on scripts are bogus
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Nov 10 12:20:00 PST 2000
>Closed-Date:
>Last-Modified:
>Originator: Mike Meyer
>Release: FreeBSD 5.0-CURRENT i386
>Organization:
Meyer Consulting
>Environment:
System: FreeBSD guru.mired.org 5.0-CURRENT FreeBSD 5.0-CURRENT #22: Tue Nov 7 22:31:36 CST 2000 mwm@guru.mired.org:/sharetmp/src/sys/compile/GURU i386
libc is involved.
>Description:
If an error is found with the interpreter in an executable script, the
error with the interpreter is reported to the shell, which then
reports the problem to the user as belonging to the script. So the
user winds up seeing "/usr/local/bin/script: No such file or
directory" or "/usr/local/bin/script: Permission denied" and so on,
even though "which script" reports /usr/local/bin/script, and the
permission are clearly correct, and in general the problem isn't with
the script. These error messages are at best misleading, and at worst
wrong.
This is a kernel problem, as its error indication is wrong. There's
no way for the shell to do anything other than what it does.
>How-To-Repeat:
Create a mode 755 file on your path with first lines like:
#!/dev/null/notthere or #!/etc/fstab or #!/usr/bin/shar and notice
that you get messages that finger the script, but apply to the file
you listed in the executable.
>Fix:
The attached patch solves the problem. The first file patched
(kern_exec.c) fixes the problem proper. Any errors found with the #!
line or when trying to execute an interpreter are changed to
EINVALINTERP. If the problem occurs before the shell image activer
gets started, the actual error is reported, and is probably correct
(i.e. - if the permissions on the script are wrong, it gets reported
as such).
I couldn't find an error I thought was appropriate. The second two
files patched (errlst.c & errno.h) add the EINVALINTERP error. If you
think an existing error is a good match, change EINVALINTERP in the
first file patched to that error, and skip the second two files. In
fact, I first tested the patch by using EFTYPE. The last file patched
(imgact_shell.c) is just cleanup. It currently returns ENOEXEC if
there are problems, which the first patch will change to EINVALINTERP
(or whatever), which seems cleaner. Leaving it off won't change the
behavior of the system after the first patch is applied.
If the new error number is used, shells that statically link libc will
just report "error 87" or some such until they are relinked.
--- sys/kern/kern_exec.c-orig Fri Nov 10 03:06:47 2000
+++ sys/kern/kern_exec.c Fri Nov 10 04:09:03 2000
@@ -382,6 +382,7 @@
/* NOT REACHED */
return(0);
} else {
+ if (error && imgp->interpreted) error = EINVALINTERP;
return(error);
}
}
--- lib/libc/gen/errlst.c-orig Fri Nov 10 03:15:18 2000
+++ lib/libc/gen/errlst.c Fri Nov 10 03:15:46 2000
@@ -143,6 +143,7 @@
"Value too large to be stored in data type", /* 84 - EOVERFLOW */
"Operation canceled", /* 85 - ECANCELED */
"Illegal byte sequence", /* 86 - EILSEQ */
+ "Invalid interpreter", /* 87 - EINVALINTERP */
};
int errno;
const int sys_nerr = sizeof(sys_errlist) / sizeof(sys_errlist[0]);
--- sys/sys/errno.h-orig Fri Nov 10 03:12:06 2000
+++ sys/sys/errno.h Fri Nov 10 03:12:47 2000
@@ -167,7 +167,8 @@
#define EOVERFLOW 84 /* Value too large to be stored in data type */
#define ECANCELED 85 /* Operation canceled */
#define EILSEQ 86 /* Illegal byte sequence */
-#define ELAST 86 /* Must be equal largest errno */
+#define EINVALINTERP 87 /* Invalid Interpreter */
+#define ELAST 87 /* Must be equal largest errno */
#endif /* _POSIX_SOURCE */
--- imgact_shell.c-orig Wed Apr 26 15:58:39 2000
+++ imgact_shell.c Fri Nov 10 03:29:11 2000
@@ -60,7 +60,7 @@
* script. :-)
*/
if (imgp->interpreted)
- return(ENOEXEC);
+ return(EINVALINTERP);
imgp->interpreted = 1;
@@ -74,7 +74,7 @@
*/
for (ihp = &image_header[2]; *ihp != '\n' && *ihp != '#'; ++ihp) {
if (ihp >= &image_header[MAXSHELLCMDLEN])
- return(ENOEXEC);
+ return(EINVALINTERP);
}
line_endp = ihp;
@@ -92,7 +92,7 @@
/* Disallow a null interpreter filename */
if (*imgp->interpreter_name == '\0')
- return(ENOEXEC);
+ return(EINVALINTERP);
/* reset for another pass */
ihp = &image_header[2];
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20001110201544.45033.qmail>
