diff options
author | Erik Faye-Lund <kusmabite@gmail.com> | 2010-11-23 19:38:27 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-11-23 16:06:47 -0800 |
commit | 9585ed519c59d5ac46f8e12b339220cdd0567b7d (patch) | |
tree | 3f182d4e555918abcae2cf4dc4b4821dd805ba4a /compat | |
parent | 20c6788aced1237489824db3b25285afed0ad169 (diff) | |
download | git-9585ed519c59d5ac46f8e12b339220cdd0567b7d.tar.gz git-9585ed519c59d5ac46f8e12b339220cdd0567b7d.tar.xz |
win32: dirent: handle errors
Previously all error conditions were ignored. Be nice, and set errno
when we should.
Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'compat')
-rw-r--r-- | compat/mingw.c | 2 | ||||
-rw-r--r-- | compat/msvc.c | 28 |
2 files changed, 28 insertions, 2 deletions
diff --git a/compat/mingw.c b/compat/mingw.c index 29f403649..9f8f37f06 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -1582,7 +1582,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 88c609325..199eb220f 100644 --- a/compat/msvc.c +++ b/compat/msvc.c @@ -5,8 +5,29 @@ DIR *opendir(const char *name) { - int len = strlen(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 = malloc(sizeof(DIR) + len + 2); if (!p) return NULL; @@ -21,6 +42,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); |