If a non-directory is opened, ENODIR should be returned from
opendir()/fdopendir() right away and not only during readdir_r().

Validate the type of opened file during open.

Signed-off-by: Thomas Weißschuh <[email protected]>
---
 tools/include/nolibc/dirent.h | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/tools/include/nolibc/dirent.h b/tools/include/nolibc/dirent.h
index 4e02ef25e72d..25fbff208998 100644
--- a/tools/include/nolibc/dirent.h
+++ b/tools/include/nolibc/dirent.h
@@ -30,10 +30,23 @@ typedef struct {
 static __attribute__((unused))
 DIR *fdopendir(int fd)
 {
+       struct stat buf;
+       int ret;
+
        if (fd < 0) {
                SET_ERRNO(EBADF);
                return NULL;
        }
+
+       ret = fstat(fd, &buf);
+       if (ret < 0)
+               return NULL;
+
+       if (!S_ISDIR(buf.st_mode)) {
+               SET_ERRNO(ENOTDIR);
+               return NULL;
+       }
+
        return (DIR *)(intptr_t)~fd;
 }
 

-- 
2.55.0


Reply via email to