[RFC PATCH 4/6] win32: dirent: handle errors
From: Erik Faye-Lund <hidden>
Date: 2016-06-15 22:50:05
Subsystem:
the rest · Maintainer:
Linus Torvalds
Previously all error conditions were ignored. Be nice, and set errno when we should. Signed-off-by: Erik Faye-Lund <redacted> --- compat/mingw.c | 2 +- compat/msvc.c | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/compat/mingw.c b/compat/mingw.c
index fdbf093..d8fd5d8 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c@@ -1584,7 +1584,7 @@ struct dirent *mingw_readdir(DIR *dir) HANDLE handle; struct mingw_DIR *mdir = (struct mingw_DIR*)dir; - if (!dir->dd_handle) { + if (!dir || !dir->dd_handle) { errno = EBADF; /* No set_errno for mingw */ return NULL; }
diff --git a/compat/msvc.c b/compat/msvc.c
index 38f2d92..8417fd3 100644
--- a/compat/msvc.c
+++ b/compat/msvc.c@@ -5,8 +5,29 @@ DIR *opendir(const char *name) { - int len = strlen(p->dd_name); + DWORD attrs = GetFileAttributes(name); + int len; DIR *p; + + /* check for valid path */ + if (attrs == INVALID_FILE_ATTRIBUTES) { + errno = ENOENT; + return NULL; + } + + /* check if it's a directory */ + if (!(attrs & FILE_ATTRIBUTE_DIRECTORY)) { + errno = ENOTDIR; + return NULL; + } + + /* check that the pattern won't be too long for FindFirstFileA */ + len = strlen(name); + if (len + 2 >= MAX_PATH) { + errno = ENAMETOOLONG; + return NULL; + } + p = xmalloc(sizeof(DIR) + len + 2); memset(p, 0, sizeof(DIR) + len + 2); strcpy(p->dd_name, name);
@@ -18,6 +39,11 @@ DIR *opendir(const char *name) } int closedir(DIR *dir) { + if (!dir) { + errno = EBADF; + return -1; + } + if (dir->dd_handle != (long)INVALID_HANDLE_VALUE) FindClose((HANDLE)dir->dd_handle); free(dir);
--
1.7.3.2.493.ge4bf7