From a5701cf2fe2b577488f4f9d2e616d5872e3c3e14 Mon Sep 17 00:00:00 2001 From: Hallvard Furuseth Date: Sat, 22 Jun 2013 23:01:30 +0200 Subject: [PATCH] Fix Windows I/O. Don't put a 64-bit filesize in a 32-bit int before shifting down. Always pass &sizehi to SetFilePointer->maxsize, so sizelo not is treated a signed distance. Hide unused vars when _WIN32. Reinitialize OVERLAPPED before reuse. --- libraries/liblmdb/mdb.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 071d6f90dd..2c6a47f31c 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -2211,7 +2211,6 @@ mdb_page_flush(MDB_txn *txn) MDB_page *dp; #ifdef _WIN32 OVERLAPPED ov; - memset(&ov, 0, sizeof(ov)); #else struct iovec iov[MDB_COMMIT_PAGES]; ssize_t wpos, wsize, wres; @@ -2251,9 +2250,9 @@ mdb_page_flush(MDB_txn *txn) * system call. */ DPRINTF("committing page %zu", pgno); + memset(&ov, 0, sizeof(ov)); ov.Offset = pos & 0xffffffff; - ov.OffsetHigh = pos >> 16; - ov.OffsetHigh >>= 16; + ov.OffsetHigh = pos >> 16 >> 16; if (!WriteFile(env->me_fd, dp, size, NULL, &ov)) { rc = ErrCode(); DPRINTF("WriteFile: %d", rc); @@ -2606,6 +2605,8 @@ mdb_env_write_meta(MDB_txn *txn) HANDLE mfd; #ifdef _WIN32 OVERLAPPED ov; +#else + int r2; #endif assert(txn != NULL); @@ -2674,7 +2675,6 @@ mdb_env_write_meta(MDB_txn *txn) rc = pwrite(mfd, ptr, len, off); #endif if (rc != len) { - int r2; rc = ErrCode(); DPUTS("write failed, disk error?"); /* On a failure, the pagecache still contains the new data. @@ -2782,9 +2782,12 @@ static int mdb_env_open2(MDB_env *env) { unsigned int flags = env->me_flags; - int i, newenv = 0, prot; + int i, newenv = 0; MDB_meta meta; MDB_page *p; +#ifndef _WIN32 + int prot; +#endif memset(&meta, 0, sizeof(meta)); @@ -2815,16 +2818,15 @@ mdb_env_open2(MDB_env *env) HANDLE mh; LONG sizelo, sizehi; sizelo = env->me_mapsize & 0xffffffff; - sizehi = env->me_mapsize >> 16; /* pointless on WIN32, only needed on W64 */ - sizehi >>= 16; + sizehi = env->me_mapsize >> 16 >> 16; /* only needed on Win64 */ /* Windows won't create mappings for zero length files. * Just allocate the maxsize right now. */ if (newenv) { - SetFilePointer(env->me_fd, sizelo, sizehi ? &sizehi : NULL, 0); - if (!SetEndOfFile(env->me_fd)) + if (SetFilePointer(env->me_fd, sizelo, &sizehi, 0) != (DWORD)sizelo + || !SetEndOfFile(env->me_fd) + || SetFilePointer(env->me_fd, 0, NULL, 0) != 0) return ErrCode(); - SetFilePointer(env->me_fd, 0, NULL, 0); } mh = CreateFileMapping(env->me_fd, NULL, flags & MDB_WRITEMAP ? PAGE_READWRITE : PAGE_READONLY,