diff --git a/dirmngr/cdb.h b/dirmngr/cdb.h --- a/dirmngr/cdb.h +++ b/dirmngr/cdb.h @@ -20,9 +20,6 @@ struct cdb { int cdb_fd; /* file descriptor */ /* private members */ -#ifdef HAVE_W32_SYSTEM - void *cdb_mapping; /* Mapping handle. */ -#endif cdbi_t cdb_fsize; /* datafile size */ const unsigned char *cdb_mem; /* mmap'ed file memory */ cdbi_t cdb_vpos, cdb_vlen; /* found data */ diff --git a/dirmngr/cdblib.c b/dirmngr/cdblib.c --- a/dirmngr/cdblib.c +++ b/dirmngr/cdblib.c @@ -115,9 +115,7 @@ { struct stat st; unsigned char *mem; -#ifdef _WIN32 - HANDLE hFile, hMapping; -#else +#ifndef _WIN32 unsigned int fsize; #endif @@ -129,23 +127,26 @@ gpg_err_set_errno (EPROTO); return -1; } - /* memory-map file */ #ifdef _WIN32 -# ifdef __MINGW32CE__ - hFile = fd; -# else - hFile = (HANDLE) _get_osfhandle(fd); -# endif - if (hFile == (HANDLE) -1) - return -1; - hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); - if (!hMapping) + /* Read the full file */ + mem = malloc (st.st_size); + if (!mem) { + gpg_err_set_errno (ENOMEM); return -1; - mem = (unsigned char *)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0); - if (!mem) + } + + /* error out if the file was somehow modified */ + if (read (fd, mem, st.st_size) != st.st_size) { + free (mem); + gpg_err_set_errno (EIO); return -1; - cdbp->cdb_mapping = hMapping; + } + + close (fd); + fd = -1; + #else /*!_WIN32*/ + /* memory-map file */ fsize = (unsigned int)(st.st_size & 0xffffffffu); mem = (unsigned char*)mmap(NULL, fsize, PROT_READ, MAP_SHARED, fd, 0); if (mem == MAP_FAILED) @@ -182,9 +183,7 @@ { if (cdbp->cdb_mem) { #ifdef _WIN32 - UnmapViewOfFile ((void*) cdbp->cdb_mem); - CloseHandle (cdbp->cdb_mapping); - cdbp->cdb_mapping = NULL; + free ((void*)cdbp->cdb_mem); #else munmap((void*)cdbp->cdb_mem, cdbp->cdb_fsize); #endif /* _WIN32 */ diff --git a/dirmngr/crlcache.c b/dirmngr/crlcache.c --- a/dirmngr/crlcache.c +++ b/dirmngr/crlcache.c @@ -372,7 +372,7 @@ int fd = cdb_fileno (entry->cdb); cdb_free (entry->cdb); xfree (entry->cdb); - if (close (fd)) + if (fd != -1 && close (fd)) log_error (_("error closing cache file: %s\n"), strerror(errno)); } xfree (entry->release_ptr);