ITS#7886 fix mdb_copy write size
authorHoward Chu <hyc@symas.com>
Mon, 30 Jun 2014 11:41:50 +0000 (04:41 -0700)
committerHoward Chu <hyc@symas.com>
Mon, 30 Jun 2014 11:41:50 +0000 (04:41 -0700)
Don't try to write past end of file

libraries/liblmdb/mdb.c

index c5311fab32615a6ffae76fec74a605df6ad41fa5..750c2bb161bc8409ee56a4d669fbc781ec2f711f 100644 (file)
@@ -4505,7 +4505,23 @@ mdb_env_copyfd(MDB_env *env, HANDLE fd)
        if (rc)
                goto leave;
 
-       wsize = txn->mt_next_pgno * env->me_psize - wsize;
+       w2 = txn->mt_next_pgno * env->me_psize;
+#ifdef WIN32
+       {
+               LARGE_INTEGER fsize;
+               GetFileSizeEx(env->me_fd, &fsize);
+               if (w2 > fsize.QuadPart)
+                       w2 = fsize.QuadPart;
+       }
+#else
+       {
+               struct stat st;
+               fstat(env->me_fd, &st);
+               if (w2 > (size_t)st.st_size)
+                       w2 = st.st_size;
+       }
+#endif
+       wsize = w2 - wsize;
        while (wsize > 0) {
                if (wsize > MAX_WRITE)
                        w2 = MAX_WRITE;