summaryrefslogtreecommitdiff
path: root/compat/msvc.c
diff options
context:
space:
mode:
Diffstat (limited to 'compat/msvc.c')
-rw-r--r--compat/msvc.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/compat/msvc.c b/compat/msvc.c
index 88c6093258..199eb220f4 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);