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 <[email protected]>
Fixes: http://bugs.debian.org/548687
Signed-off-by: Jonathan Nieder <[email protected]>
---
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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to