From 52acc6d5ac3e4bf32924dc0819db19c654889436 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Sat, 16 Jun 2018 18:43:46 +0300 Subject: Version 1.5 * configure.ac: Version 1.5 * NEWS: Update. * src/Makefile.am (VI_CURRENT): Increment to 6 * src/bucket.c (_gdbm_get_bucket): Fix the upper limit for bucket_bits. * src/falloc.c (push_avail_block): Fill the allocated block with 0s. --- NEWS | 17 ++++++++++++----- configure.ac | 4 ++-- src/Makefile.am | 2 +- src/bucket.c | 4 ++-- src/falloc.c | 2 +- src/gdbmopen.c | 2 +- src/gdbmsetopt.c | 2 +- src/gdbmtool.c | 2 +- 8 files changed, 21 insertions(+), 14 deletions(-) diff --git a/NEWS b/NEWS index ba245aa..76f7db0 100644 --- a/NEWS +++ b/NEWS @@ -1,14 +1,21 @@ -GNU dbm NEWS -- history of user-visible changes. 2018-05-25 +GNU dbm NEWS -- history of user-visible changes. 2018-06-16 Copyright (C) 1990-2018 Free Software Foundation, Inc. See the end of file for copying conditions. Please send gdbm bug reports to . -Version 1.14.90 +Version 1.15 - 2018-06-15 -FIXME: BUMP VI_MAJOR +* Extensive database consistency checking -* Implement database consistency checks +GDBM tries to detect inconsistencies in input database files as +early as possible. When an inconcistency is detected, a helpful +diagnostics is returned and the database is marked as needing +recovery. From this moment on, any GDBM function trying to access +the database will immediately return error code (instead of +eventually segfaulting as previous versions did). In order to +reconstruct the database and return it to healthy state, the +gdbm_recover function should be used. Special thanks to Lionel Debroux and Craig Young for investing their time and efforts in testing and providing valuable feedback. @@ -33,7 +40,7 @@ e.g.: * New member in the gdbm_recovery structure: duplicate_keys. Upon return from gdbm_recover, this member holds the number of keys -that were not recovered, because the same key has already been stored +that has not been recovered, because the same key had already been stored in the database. The actual number of stored keys is thus recovered_keys - duplicate_keys. diff --git a/configure.ac b/configure.ac index 48ad675..505ba09 100644 --- a/configure.ac +++ b/configure.ac @@ -16,8 +16,8 @@ # along with GDBM. If not, see . */ m4_define([_GDBM_VERSION_MAJOR], 1) -m4_define([_GDBM_VERSION_MINOR], 14) -m4_define([_GDBM_VERSION_PATCH], 90) +m4_define([_GDBM_VERSION_MINOR], 15) +dnl m4_define([_GDBM_VERSION_PATCH], 0) AC_INIT([gdbm], _GDBM_VERSION_MAJOR._GDBM_VERSION_MINOR[]m4_ifdef([_GDBM_VERSION_PATCH],._GDBM_VERSION_PATCH), diff --git a/src/Makefile.am b/src/Makefile.am index 0d2ca53..2710bf0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -33,7 +33,7 @@ BUILT_SOURCES = gdbm.h gram.h gram.h: gram.c # The libraries -VI_CURRENT = 5 +VI_CURRENT = 6 VI_REVISION = 0 VI_AGE = 0 diff --git a/src/bucket.c b/src/bucket.c index a3e8f4e..4b69bbe 100644 --- a/src/bucket.c +++ b/src/bucket.c @@ -29,7 +29,7 @@ void _gdbm_new_bucket (GDBM_FILE dbf, hash_bucket *bucket, int bits) { int index; - + /* Initialize the avail block. */ bucket->av_count = 0; @@ -146,7 +146,7 @@ _gdbm_get_bucket (GDBM_FILE dbf, int dir_index) if (!(bucket->count >= 0 && bucket->count <= dbf->header->bucket_elems && bucket->bucket_bits >= 0 - && bucket->bucket_bits <= GDBM_HASH_BITS)) + && bucket->bucket_bits <= dbf->header->dir_bits)) { GDBM_SET_ERRNO (dbf, GDBM_BAD_BUCKET, TRUE); return -1; diff --git a/src/falloc.c b/src/falloc.c index 2f21ebe..6571d9b 100644 --- a/src/falloc.c +++ b/src/falloc.c @@ -292,7 +292,7 @@ push_avail_block (GDBM_FILE dbf) av_adr = new_loc.av_adr; /* Split the header block. */ - temp = malloc (av_size); + temp = calloc (1, av_size); if (temp == NULL) { GDBM_SET_ERRNO (dbf, GDBM_MALLOC_ERROR, TRUE); diff --git a/src/gdbmopen.c b/src/gdbmopen.c index 03cc4f4..677f1cf 100644 --- a/src/gdbmopen.c +++ b/src/gdbmopen.c @@ -154,7 +154,7 @@ validate_header (gdbm_file_header const *hdr, struct stat const *st) if (hdr->dir_bits != dir_bits) return GDBM_BAD_HEADER; - if (!(hdr->bucket_size > 0 && hdr->bucket_size > sizeof(hash_bucket))) + if (!(hdr->bucket_size > sizeof(hash_bucket))) return GDBM_BAD_HEADER; if (hdr->bucket_elems != bucket_element_count (hdr->bucket_size)) diff --git a/src/gdbmsetopt.c b/src/gdbmsetopt.c index f9face0..865f5a5 100644 --- a/src/gdbmsetopt.c +++ b/src/gdbmsetopt.c @@ -54,13 +54,13 @@ setopt_gdbm_setcachesize (GDBM_FILE dbf, void *optval, int optlen) { size_t sz; - /* Optval will point to the new size of the cache. */ if (dbf->bucket_cache != NULL) { GDBM_SET_ERRNO (dbf, GDBM_OPT_ALREADY_SET, FALSE); return -1; } + /* Optval will point to the new size of the cache. */ if (get_size (optval, optlen, &sz)) { GDBM_SET_ERRNO (dbf, GDBM_OPT_ILLEGAL, FALSE); diff --git a/src/gdbmtool.c b/src/gdbmtool.c index 6d56578..d0b2694 100644 --- a/src/gdbmtool.c +++ b/src/gdbmtool.c @@ -919,7 +919,7 @@ list_handler (struct handler_param *param) data = gdbm_fetch (gdbm_file, key); if (!data.dptr) { - terror (_("cannot fetch data; the key was:")); + terror (_("%s; the key was:"), gdbm_db_strerror (gdbm_file)); datum_format (stderr, &key, dsdef[DS_KEY]); } else -- cgit v1.2.1