Close the windows file handle after CreateFileMapping; it isn't needed

I did the changes file; the rest came pseudonymously
This commit is contained in:
Nick Mathewson 2012-05-23 12:39:05 -04:00
parent 75fc4dbbca
commit ab1b81e838
3 changed files with 12 additions and 8 deletions

View file

@ -0,0 +1,4 @@
o Minor bugfixes:
- Don't hold a windows file handle open for every file mapping;
the file mapping handle is sufficient. Fix for bug 5951; bugfix on
0.1.2.1-alpha.

View file

@ -175,24 +175,24 @@ tor_mmap_file(const char *filename)
TCHAR tfilename[MAX_PATH]= {0}; TCHAR tfilename[MAX_PATH]= {0};
tor_mmap_t *res = tor_malloc_zero(sizeof(tor_mmap_t)); tor_mmap_t *res = tor_malloc_zero(sizeof(tor_mmap_t));
int empty = 0; int empty = 0;
res->file_handle = INVALID_HANDLE_VALUE; HANDLE file_handle = INVALID_HANDLE_VALUE;
res->mmap_handle = NULL; res->mmap_handle = NULL;
#ifdef UNICODE #ifdef UNICODE
mbstowcs(tfilename,filename,MAX_PATH); mbstowcs(tfilename,filename,MAX_PATH);
#else #else
strlcpy(tfilename,filename,MAX_PATH); strlcpy(tfilename,filename,MAX_PATH);
#endif #endif
res->file_handle = CreateFile(tfilename, file_handle = CreateFile(tfilename,
GENERIC_READ, FILE_SHARE_READ, GENERIC_READ, FILE_SHARE_READ,
NULL, NULL,
OPEN_EXISTING, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_NORMAL,
0); 0);
if (res->file_handle == INVALID_HANDLE_VALUE) if (file_handle == INVALID_HANDLE_VALUE)
goto win_err; goto win_err;
res->size = GetFileSize(res->file_handle, NULL); res->size = GetFileSize(file_handle, NULL);
if (res->size == 0) { if (res->size == 0) {
log_info(LD_FS,"File \"%s\" is empty. Ignoring.",filename); log_info(LD_FS,"File \"%s\" is empty. Ignoring.",filename);
@ -200,7 +200,7 @@ tor_mmap_file(const char *filename)
goto err; goto err;
} }
res->mmap_handle = CreateFileMapping(res->file_handle, res->mmap_handle = CreateFileMapping(file_handle,
NULL, NULL,
PAGE_READONLY, PAGE_READONLY,
#if SIZEOF_SIZE_T > 4 #if SIZEOF_SIZE_T > 4
@ -218,6 +218,7 @@ tor_mmap_file(const char *filename)
if (!res->data) if (!res->data)
goto win_err; goto win_err;
CloseHandle(file_handle);
return res; return res;
win_err: { win_err: {
DWORD e = GetLastError(); DWORD e = GetLastError();
@ -234,6 +235,8 @@ tor_mmap_file(const char *filename)
err: err:
if (empty) if (empty)
errno = ERANGE; errno = ERANGE;
if (file_handle != INVALID_HANDLE_VALUE)
CloseHandle(file_handle);
tor_munmap_file(res); tor_munmap_file(res);
return NULL; return NULL;
} }
@ -247,8 +250,6 @@ tor_munmap_file(tor_mmap_t *handle)
if (handle->mmap_handle != NULL) if (handle->mmap_handle != NULL)
CloseHandle(handle->mmap_handle); CloseHandle(handle->mmap_handle);
if (handle->file_handle != INVALID_HANDLE_VALUE)
CloseHandle(handle->file_handle);
tor_free(handle); tor_free(handle);
} }
#else #else

View file

@ -249,7 +249,6 @@ typedef struct tor_mmap_t {
size_t mapping_size; /**< Size of the actual mapping. (This is this file size_t mapping_size; /**< Size of the actual mapping. (This is this file
* size, rounded up to the nearest page.) */ * size, rounded up to the nearest page.) */
#elif defined MS_WINDOWS #elif defined MS_WINDOWS
HANDLE file_handle;
HANDLE mmap_handle; HANDLE mmap_handle;
#endif #endif