Fixed Bug: AXIS2C-1674. Simple HttpServer crashes when reading directories in Windows 2012 Server
diff --git a/util/src/platforms/windows/dir_windows.c b/util/src/platforms/windows/dir_windows.c
index 1e0ad8f..4436e00 100644
--- a/util/src/platforms/windows/dir_windows.c
+++ b/util/src/platforms/windows/dir_windows.c
@@ -29,10 +29,10 @@
{
AXIS2_DIR *dirp;
char *filespec;
- long handle;
+ HANDLE handle;
int index;
- filespec = malloc(strlen(_dirname) + 2 + 1);
+ filespec = (char*)malloc(strlen(_dirname) + 2 + 1);
strcpy(filespec, _dirname);
index = (int)strlen(filespec) - 1;
if(index >= 0 && (filespec[index] == '/' || (filespec[index] == '\\' && !IsDBCSLeadByte(
@@ -44,18 +44,26 @@
dirp->offset = 0;
dirp->finished = 0;
- if((handle = (long)_findfirst(filespec, &(dirp->fileinfo))) < 0)
- /* We are sure that the difference lies within the long range */
- {
- if(errno == ENOENT || errno == EINVAL)
- dirp->finished = 1;
- else
- {
- free(dirp);
- free(filespec);
- return NULL;
- }
- }
+ handle = FindFirstFile(filespec, &(dirp->fileinfo));
+ if (handle == INVALID_HANDLE_VALUE)
+ {
+ DWORD dwErr = GetLastError();
+ if (dwErr == ERROR_FILE_NOT_FOUND || dwErr == ERROR_PATH_NOT_FOUND
+ || dwErr == ERROR_NO_MORE_FILES || dwErr == ERROR_NOT_READY)
+ {
+ fprintf(stderr, "FindFirstFile with unexpected result. Error code: %u\r\n", dwErr);
+
+ dirp->finished = 1;
+ }
+ else
+ {
+ free(dirp);
+ free(filespec);
+ fprintf(stderr, "FindFirstFile failed. Error code: %u\r\n", dwErr);
+ return NULL;
+ }
+ }
+
/* We are using the ISO C++ conformant name: _strdup, as demanded by VS 2005 */
dirp->dirname = _strdup(_dirname);
dirp->handle = handle;
@@ -71,7 +79,7 @@
int iret = -1;
if(!_dirp)
return iret;
- iret = _findclose(_dirp->handle);
+ iret = FindClose(_dirp->handle);
if(_dirp->dirname)
free(_dirp->dirname);
if(_dirp)
@@ -89,7 +97,7 @@
if(_dirp->offset != 0)
{
- if(_findnext(_dirp->handle, &(_dirp->fileinfo)) < 0)
+ if(FindNextFile(_dirp->handle, &(_dirp->fileinfo)) == 0)
{
_dirp->finished = 1;
return NULL;
@@ -97,7 +105,7 @@
}
_dirp->offset++;
- strcpy(_dirp->dent.d_name, _dirp->fileinfo.name); /*, _MAX_FNAME+1); */
+ strcpy(_dirp->dent.d_name, _dirp->fileinfo.cFileName); /*, _MAX_FNAME+1); */
_dirp->dent.d_ino = 1;
_dirp->dent.d_reclen = (unsigned short)strlen(_dirp->dent.d_name);
_dirp->dent.d_off = _dirp->offset;
@@ -119,7 +127,7 @@
if(_dirp->offset != 0)
{
- if(_findnext(_dirp->handle, &(_dirp->fileinfo)) < 0)
+ if(FindNextFile(_dirp->handle, &(_dirp->fileinfo)) < 0)
{
_dirp->finished = 1;
*__result = NULL;
@@ -128,7 +136,7 @@
}
_dirp->offset++;
- strcpy(_dirp->dent.d_name, _dirp->fileinfo.name); /*, _MAX_FNAME+1); */
+ strcpy(_dirp->dent.d_name, _dirp->fileinfo.cFileName); /*, _MAX_FNAME+1); */
_dirp->dent.d_ino = 1;
_dirp->dent.d_reclen = (unsigned short)strlen(_dirp->dent.d_name);
_dirp->dent.d_off = _dirp->offset;
@@ -145,10 +153,10 @@
AXIS2_DIR * dirp)
{
char *filespec;
- long handle;
+ HANDLE handle;
int index;
- _findclose(dirp->handle);
+ FindClose(dirp->handle);
dirp->offset = 0;
dirp->finished = 0;
@@ -160,12 +168,17 @@
filespec[index] = '\0';
strcat(filespec, "/*");
- if((handle = (long)_findfirst(filespec, &(dirp->fileinfo))) < 0)
- /* We are sure that the difference lies within the int range */
+ handle = FindFirstFile(filespec, &(dirp->fileinfo));
+ if(handle == INVALID_HANDLE_VALUE)
{
- if(errno == ENOENT || errno == EINVAL)
- dirp->finished = 1;
+ DWORD dwErr = GetLastError();
+ if (dwErr == ERROR_FILE_NOT_FOUND || dwErr == ERROR_PATH_NOT_FOUND
+ || dwErr == ERROR_NO_MORE_FILES || dwErr == ERROR_NOT_READY)
+ {
+ dirp->finished = 1;
+ }
}
+
dirp->handle = handle;
free(filespec);