]> git.ipfire.org Git - thirdparty/git.git/blobdiff - compat/msvc.c
win32: dirent: handle errors
[thirdparty/git.git] / compat / msvc.c
index 88c6093258eaa117996668026734ea8e6eb2761a..199eb220f42032c1b50dd226dbea084cc10ccd38 100644 (file)
@@ -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);