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