summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2021-08-02 12:59:36 +0300
committerSergey Poznyakoff <gray@gnu.org>2021-08-02 12:59:36 +0300
commit5557f48506e533cdf58fda35a38eb471d4736cb9 (patch)
tree2e1b3504fb68980eabce77112c2d7f5bb57c32b5
parent6f0ec93a12ba936d60cb3a34b8df07145774d24c (diff)
downloadgdbm-5557f48506e533cdf58fda35a38eb471d4736cb9.tar.gz
Fix gdbm_recover
* src/recover.c (_gdbm_finish_transfer): Close snapshot descriptors, if any. Restore xheader, avail, and avail_size members.
-rw-r--r--src/recover.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/recover.c b/src/recover.c
index b4b577c..0a82507 100644
--- a/src/recover.c
+++ b/src/recover.c
@@ -105,6 +105,8 @@ _gdbm_finish_transfer (GDBM_FILE dbf, GDBM_FILE new_dbf,
return -1;
}
+ _gdbmsync_done (dbf);
+
#if HAVE_MMAP
_gdbm_mapped_unmap (dbf);
#endif
@@ -153,6 +155,10 @@ _gdbm_finish_transfer (GDBM_FILE dbf, GDBM_FILE new_dbf,
dbf->bucket = new_dbf->bucket;
dbf->bucket_dir = new_dbf->bucket_dir;
+ dbf->avail = new_dbf->avail;
+ dbf->avail_size = new_dbf->avail_size;
+ dbf->xheader = new_dbf->xheader;
+
dbf->cache_size = new_dbf->cache_size;
dbf->cache_num = new_dbf->cache_num;
dbf->cache_tree = new_dbf->cache_tree;
@@ -399,6 +405,7 @@ gdbm_recover (GDBM_FILE dbf, gdbm_recovery *rcvr, int flags)
new_dbf = gdbm_fd_open (fd, new_name, dbf->header->block_size,
GDBM_WRCREAT
| (dbf->cloexec ? GDBM_CLOEXEC : 0)
+ | (dbf->xheader ? GDBM_NUMSYNC : 0)
| GDBM_CLOERROR, dbf->fatal_err);
SAVE_ERRNO (free (new_name));