open() succeeds, though read() fails later, when a pathname passed as argv[0] on the command line points to a directory, which somehow results in dash thinking everything is okay: $ sh dir/ $ echo $? 0 But POSIX makes it clear enough that in "sh command_file", command_file is supposed to be a file, not a directory. So diagnose this with an error message and exit with status 2. Reported-by: Jari Aalto <jari.aalto@xxxxxxxxx> Fixes: http://bugs.debian.org/548687 Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> --- Applies on top of the previous patch, which is based on master. Thanks to Gerrit and Krzysztof for your help so far. src/input.c | 21 ++++++++++++++++++++- 1 files changed, 20 insertions(+), 1 deletions(-) diff --git a/src/input.c b/src/input.c index e57ad76..d68d441 100644 --- a/src/input.c +++ b/src/input.c @@ -395,6 +395,19 @@ popstring(void) } +/* + * Is fd a directory file descriptor? + */ + +static int +isdir(const char *fname, int fd) +{ + struct stat64 statb; + if (fstat64(fd, &statb) < 0) + sh_error("Can't stat %s", fname); + return S_ISDIR(statb.st_mode); +} + /* * Set the input to take input from a file. If push is set, push the * old input onto the stack first. */ @@ -405,7 +418,13 @@ setinputfile(const char *fname, int flags) int fd; INTOFF; - if ((fd = open(fname, O_RDONLY)) < 0) { + fd = open(fname, O_RDONLY); + if (isdir(fname, fd)) { + close(fd); + fd = -1; + errno = EISDIR; + } + if (fd < 0) { if (flags & INPUT_NOFILE_OK) goto out; sh_error("Can't open %s", fname); -- 1.7.2.3 -- To unsubscribe from this list: send the line "unsubscribe dash" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html