]> git.sur5r.net Git - openldap/commitdiff
fix Windows mdb_env_copy(), WriteFile overflow
authorHoward Chu <hyc@symas.com>
Tue, 23 Oct 2012 11:32:55 +0000 (04:32 -0700)
committerHoward Chu <hyc@symas.com>
Tue, 23 Oct 2012 11:32:55 +0000 (04:32 -0700)
libraries/libmdb/mdb.c

index 7d89ec3fbcbaab59d0a0fa88c39c05644a299983..92362a36f5c36aa0c759523a12a19a921ca4f7dd 100644 (file)
@@ -3431,10 +3431,17 @@ mdb_env_copy(MDB_env *env, const char *path)
        ptr = env->me_map + wsize;
        wsize = txn->mt_next_pgno * env->me_psize - wsize;
 #ifdef _WIN32
-       {
-               DWORD len;
-               rc = WriteFile(newfd, ptr, wsize, &len, NULL);
-               rc = (len == wsize) ? MDB_SUCCESS : ErrCode();
+#define MAX_UINT32     4294967295U
+       while (wsize > 0) {
+               DWORD len, w2;
+               if (wsize > MAX_UINT32)
+                       w2 = MAX_UINT32 - env->me_psize + 1;    /* write in pagesize chunks */
+               else
+                       w2 = wsize;
+               rc = WriteFile(newfd, ptr, w2, &len, NULL);
+               rc = (len == w2) ? MDB_SUCCESS : ErrCode();
+               if (rc) break;
+               wsize -= w2;
        }
 #else
        rc = write(newfd, ptr, wsize);