summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Faye-Lund <kusmabite@gmail.com>2010-11-23 18:38:27 (GMT)
committerJunio C Hamano <gitster@pobox.com>2010-11-24 00:06:47 (GMT)
commit9585ed519c59d5ac46f8e12b339220cdd0567b7d (patch)
tree3f182d4e555918abcae2cf4dc4b4821dd805ba4a
parent20c6788aced1237489824db3b25285afed0ad169 (diff)
downloadgit-9585ed519c59d5ac46f8e12b339220cdd0567b7d.zip
git-9585ed519c59d5ac46f8e12b339220cdd0567b7d.tar.gz
git-9585ed519c59d5ac46f8e12b339220cdd0567b7d.tar.bz2
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>
-rw-r--r--compat/mingw.c2
-rw-r--r--compat/msvc.c28
2 files changed, 28 insertions, 2 deletions
diff --git a/compat/mingw.c b/compat/mingw.c
index 29f4036..9f8f37f 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 88c6093..199eb22 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);