Changeset: ea640ee57cbb for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ea640ee57cbb
Modified Files:
        common/utils/mutils.c
        common/utils/mutils.h
        gdk/gdk_posix.c
Branch: Jan2014
Log Message:

Added some error checking to Windows implementation of opendir etc.


diffs (199 lines):

diff --git a/common/utils/mutils.c b/common/utils/mutils.c
--- a/common/utils/mutils.c
+++ b/common/utils/mutils.c
@@ -68,13 +68,29 @@ opendir(const char *dirname)
        DIR *result = NULL;
        char *mask;
        size_t k;
+       DWORD e;
 
-       if (dirname == NULL)
+       if (dirname == NULL) {
+               SetLastError(ERROR_INVALID_ADDRESS);
                return NULL;
+       }
 
        result = (DIR *) malloc(sizeof(DIR));
+       if (result == NULL) {
+               SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+               return NULL;
+       }
        result->find_file_data = malloc(sizeof(WIN32_FIND_DATA));
        result->dir_name = strdup(dirname);
+       if (result->find_file_data == NULL || result->dir_name) {
+               if (result->find_file_data)
+                       free(result->find_file_data);
+               if (result->dir_name)
+                       free(result->dir_name);
+               free(result);
+               SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+               return NULL;
+       }
 
        k = strlen(result->dir_name);
        if (k && result->dir_name[k - 1] == '\\') {
@@ -82,16 +98,25 @@ opendir(const char *dirname)
                k--;
        }
        mask = malloc(strlen(result->dir_name) + 3);
+       if (mask == NULL) {
+               free(result->find_file_data);
+               free(result->dir_name);
+               free(result);
+               SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+               return NULL;
+       }
        sprintf(mask, "%s\\*", result->dir_name);
 
        result->find_file_handle = FindFirstFile(mask, (LPWIN32_FIND_DATA) 
result->find_file_data);
+       if (result->find_file_handle == INVALID_HANDLE_VALUE)
+               e = GetLastError();
        free(mask);
 
        if (result->find_file_handle == INVALID_HANDLE_VALUE) {
                free(result->dir_name);
                free(result->find_file_data);
                free(result);
-               SetLastError(ERROR_OPEN_FAILED);        /* enforce EIO */
+               SetLastError(e);
                return NULL;
        }
        result->just_opened = TRUE;
@@ -102,17 +127,21 @@ opendir(const char *dirname)
 static char *
 basename(const char *file_name)
 {
-       register char *base;
+       const char *p;
+       const char *base;
 
        if (file_name == NULL)
                return NULL;
 
-       base = strrchr(file_name, '\\');
+       if (isalpha((int) (unsigned char) file_name[0]) && file_name[1] == ':')
+               file_name += 2; /* skip over drive letter */
+
+       base = NULL;
+       for (p = file_name; *p; p++)
+               if (*p == '\\' || *p == '/')
+                       base = p;
        if (base)
-               return base + 1;
-
-       if (isalpha((int) (unsigned char) file_name[0]) && file_name[1] == ':')
-               return (char *) file_name + 2;
+               return (char *) base + 1;
 
        return (char *) file_name;
 }
@@ -122,22 +151,16 @@ readdir(DIR *dir)
 {
        static struct dirent result;
 
-       if (dir == NULL)
+       if (dir == NULL) {
+               SetLastError(ERROR_INVALID_ADDRESS);
                return NULL;
+       }
 
        if (dir->just_opened)
                dir->just_opened = FALSE;
-       else {
-               if (!FindNextFile(dir->find_file_handle, (LPWIN32_FIND_DATA) 
dir->find_file_data)) {
-                       int error = GetLastError();
-
-                       if (error) {
-                               if (error != ERROR_NO_MORE_FILES)
-                                       SetLastError(ERROR_OPEN_FAILED);        
/* enforce EIO */
-                               return NULL;
-                       }
-               }
-       }
+       else if (!FindNextFile(dir->find_file_handle,
+                              (LPWIN32_FIND_DATA) dir->find_file_data))
+               return NULL;
        strncpy(result.d_name, basename(((LPWIN32_FIND_DATA) 
dir->find_file_data)->cFileName), sizeof(result.d_name));
        result.d_name[sizeof(result.d_name) - 1] = '\0';
        result.d_namelen = (int) strlen(result.d_name);
@@ -150,35 +173,39 @@ rewinddir(DIR *dir)
 {
        char *mask;
 
-       if (dir == NULL)
+       if (dir == NULL) {
+               SetLastError(ERROR_INVALID_ADDRESS);
                return;
+       }
 
        if (!FindClose(dir->find_file_handle))
                fprintf(stderr, "#rewinddir(): FindClose() failed\n");
 
        mask = malloc(strlen(dir->dir_name) + 3);
+       if (mask == NULL) {
+               SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+               dir->find_file_handle = INVALID_HANDLE_VALUE;
+               return;
+       }
        sprintf(mask, "%s\\*", dir->dir_name);
        dir->find_file_handle = FindFirstFile(mask, (LPWIN32_FIND_DATA) 
dir->find_file_data);
        free(mask);
-
-       if (dir->find_file_handle == INVALID_HANDLE_VALUE) {
-               SetLastError(ERROR_OPEN_FAILED);        /* enforce EIO */
+       if (dir->find_file_handle == INVALID_HANDLE_VALUE)
                return;
-       }
        dir->just_opened = TRUE;
 }
 
 int
 closedir(DIR *dir)
 {
-       if (dir == NULL)
-               return -1;
-
-       if (!FindClose(dir->find_file_handle)) {
-               SetLastError(ERROR_OPEN_FAILED);        /* enforce EIO */
+       if (dir == NULL) {
+               SetLastError(ERROR_INVALID_ADDRESS);
                return -1;
        }
 
+       if (!FindClose(dir->find_file_handle))
+               return -1;
+
        free(dir->dir_name);
        free(dir->find_file_data);
        free(dir);
diff --git a/common/utils/mutils.h b/common/utils/mutils.h
--- a/common/utils/mutils.h
+++ b/common/utils/mutils.h
@@ -36,7 +36,7 @@ struct DIR {
        char *dir_name;
        int just_opened;
        HANDLE find_file_handle;
-       char *find_file_data;
+       void *find_file_data;
 };
 
 typedef struct DIR DIR;
diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c
--- a/gdk/gdk_posix.c
+++ b/gdk/gdk_posix.c
@@ -1119,6 +1119,7 @@ win_errmap_t win_errmap[] = {
        {ERROR_DEVICE_IN_USE, "ERROR_DEVICE_IN_USE", EAGAIN},
        {ERROR_INVALID_AT_INTERRUPT_TIME, "ERROR_INVALID_AT_INTERRUPT_TIME", 
EINTR},
        {ERROR_IO_DEVICE, "ERROR_IO_DEVICE", EIO},
+       {ERROR_INVALID_ADDRESS, "ERROR_INVALID_ADDRESS", EFAULT},
 };
 
 #define GDK_WIN_ERRNO_TLS 13
@@ -1136,6 +1137,7 @@ win_errno(void)
                *result = 0;
                TlsSetValue(GDK_WIN_ERRNO_TLS, result);
        }
+       *result = ENOSYS;       /* fallback error */
        for (i = 0; win_errmap[i].w != 0; ++i) {
                if (err == win_errmap[i].w) {
                        *result = win_errmap[i].e;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to