diff options
-rw-r--r-- | Makefile.am | 16 | ||||
-rw-r--r-- | NEWS | 31 | ||||
-rw-r--r-- | src/findkey.c | 24 | ||||
-rw-r--r-- | src/gdbm.h.in | 4 | ||||
-rw-r--r-- | src/gdbmdefs.h | 17 | ||||
-rw-r--r-- | src/gdbmerrno.c | 3 | ||||
-rw-r--r-- | src/gdbmtool.c | 27 | ||||
-rw-r--r-- | src/mmap.c | 22 | ||||
-rw-r--r-- | src/recover.c | 32 | ||||
-rw-r--r-- | src/systems.h | 1 |
10 files changed, 157 insertions, 20 deletions
diff --git a/Makefile.am b/Makefile.am index 6e00dec..ecc03df 100644 --- a/Makefile.am +++ b/Makefile.am | |||
@@ -15,29 +15,43 @@ | |||
15 | # You should have received a copy of the GNU General Public License | 15 | # You should have received a copy of the GNU General Public License |
16 | # along with GDBM. If not, see <http://www.gnu.org/licenses/>. */ | 16 | # along with GDBM. If not, see <http://www.gnu.org/licenses/>. */ |
17 | 17 | ||
18 | EXTRA_DIST = build-aux/config.rpath NOTE-WARNING git2chg.awk | 18 | EXTRA_DIST = build-aux/config.rpath NOTE-WARNING git2chg.awk |
19 | 19 | ||
20 | if COMPAT_OPT | 20 | if COMPAT_OPT |
21 | MAYBE_COMPAT = compat | 21 | MAYBE_COMPAT = compat |
22 | endif | 22 | endif |
23 | SUBDIRS = po src doc $(MAYBE_COMPAT) tests | 23 | SUBDIRS = po src doc $(MAYBE_COMPAT) tests |
24 | 24 | ||
25 | AM_DISTCHECK_CONFIGURE_FLAGS = --enable-libgdbm-compat | 25 | AM_DISTCHECK_CONFIGURE_FLAGS = --enable-libgdbm-compat |
26 | 26 | ||
27 | dist-hook: | 27 | .PHONY: set-dist-date |
28 | set-dist-date: | ||
28 | rm -f $(distdir)/src/version.c; \ | 29 | rm -f $(distdir)/src/version.c; \ |
29 | d=`date '+%d/%m/%Y'`; \ | 30 | d=`date '+%d/%m/%Y'`; \ |
30 | sed 's|/\*@DIST_DATE@\*/|"'"$$d"'"|' $(srcdir)/src/version.c > \ | 31 | sed 's|/\*@DIST_DATE@\*/|"'"$$d"'"|' $(srcdir)/src/version.c > \ |
31 | $(distdir)/src/version.c | 32 | $(distdir)/src/version.c |
32 | 33 | ||
34 | dist-hook: ChangeLog set-dist-date | ||
35 | @if test -f ChangeLog && test -f NEWS; then \ | ||
36 | PATCHLEV=`echo "$(PACKAGE_VERSION)" | sed -r "s/[0-9]+\.[0-9]+\.?//"`;\ | ||
37 | if test $${PATCHLEV:-0} -lt 50; then \ | ||
38 | if grep -q FIXME NEWS; then \ | ||
39 | echo >&2 "*** NEWS file contains FIXMEs"; \ | ||
40 | echo >&2 "*** Aborting"; \ | ||
41 | exit 1; \ | ||
42 | fi; \ | ||
43 | fi; \ | ||
44 | fi | ||
45 | |||
46 | |||
33 | gen_start_date = 2016-07-08 | 47 | gen_start_date = 2016-07-08 |
34 | prev_change_log = ChangeLog.cvs | 48 | prev_change_log = ChangeLog.cvs |
35 | 49 | ||
36 | .PHONY: ChangeLog | 50 | .PHONY: ChangeLog |
37 | ChangeLog: | 51 | ChangeLog: |
38 | $(AM_V_GEN)if test -d .git; then \ | 52 | $(AM_V_GEN)if test -d .git; then \ |
39 | git log --pretty='format:%ct %an <%ae>%n%n%s%n%n%b%n' \ | 53 | git log --pretty='format:%ct %an <%ae>%n%n%s%n%n%b%n' \ |
40 | --since=$(gen_start_date) | \ | 54 | --since=$(gen_start_date) | \ |
41 | awk -f $(top_srcdir)/git2chg.awk \ | 55 | awk -f $(top_srcdir)/git2chg.awk \ |
42 | -v append=$(top_srcdir)/$(prev_change_log) > ChangeLog; \ | 56 | -v append=$(top_srcdir)/$(prev_change_log) > ChangeLog; \ |
43 | fi | 57 | fi |
@@ -1,26 +1,55 @@ | |||
1 | GNU dbm NEWS -- history of user-visible changes. 2018-05-19 | 1 | GNU dbm NEWS -- history of user-visible changes. 2018-05-24 |
2 | Copyright (C) 1990-2018 Free Software Foundation, Inc. | 2 | Copyright (C) 1990-2018 Free Software Foundation, Inc. |
3 | See the end of file for copying conditions. | 3 | See the end of file for copying conditions. |
4 | 4 | ||
5 | Please send gdbm bug reports to <bug-gdbm@gnu.org>. | 5 | Please send gdbm bug reports to <bug-gdbm@gnu.org>. |
6 | 6 | ||
7 | Version 1.14.90 | 7 | Version 1.14.90 |
8 | 8 | ||
9 | FIXME: BUMP VI_MAJOR | ||
10 | |||
9 | * Implement database consistency checks | 11 | * Implement database consistency checks |
10 | 12 | ||
11 | * Improved error checking | 13 | * Improved error checking |
12 | 14 | ||
13 | * Removed gdbm-1.8.3 compatibility layer | 15 | * Removed gdbm-1.8.3 compatibility layer |
14 | 16 | ||
17 | * Commands can be given to gdbmtool in the command line | ||
18 | |||
19 | The syntax is: | ||
20 | |||
21 | gdbmtool DBNAME COMMAND [ARGS...] | ||
22 | |||
23 | Multiple commands are separated by semicolon (take care to escape it), | ||
24 | e.g.: | ||
25 | |||
26 | gdbmtool t.db count\; avail | ||
27 | |||
28 | * Fixed data conversion bugs in storing structured keys or content | ||
29 | |||
30 | * New member in the gdbm_recovery structure: duplicate_keys. | ||
31 | |||
32 | Upon return from gdbm_recover, this member holds the number of keys | ||
33 | that were not recovered, because the same key has already been stored | ||
34 | in the database. The actual number of stored keys is thus | ||
35 | recovered_keys - duplicate_keys. | ||
36 | |||
37 | * New error codes. | ||
38 | |||
39 | GDBM_BAD_BUCKET "Malformed bucket header" | ||
40 | GDBM_BAD_HEADER "Malformed database file header" | ||
41 | GDBM_BAD_AVAIL "Malformed avail_block" | ||
42 | GDBM_BAD_HASH_TABLE "Malformed hash table" | ||
43 | |||
15 | 44 | ||
16 | Version 1.14.1 - 2018-01-03 | 45 | Version 1.14.1 - 2018-01-03 |
17 | 46 | ||
18 | * Increment soname current version number. | 47 | * Increment soname current version number. |
19 | 48 | ||
20 | 49 | ||
21 | Version 1.14 - 2018-01-01 | 50 | Version 1.14 - 2018-01-01 |
22 | 51 | ||
23 | * Make sure created databases are byte-for-byte reproducible | 52 | * Make sure created databases are byte-for-byte reproducible |
24 | 53 | ||
25 | This fixes two longstanding bugs: (1) when allocating database file | 54 | This fixes two longstanding bugs: (1) when allocating database file |
26 | header blocks, the unused memory is filled with zeroes; (2) when expanding | 55 | header blocks, the unused memory is filled with zeroes; (2) when expanding |
diff --git a/src/findkey.c b/src/findkey.c index 7638b04..bd9fd83 100644 --- a/src/findkey.c +++ b/src/findkey.c | |||
@@ -13,41 +13,61 @@ | |||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | GNU General Public License for more details. | 15 | GNU General Public License for more details. |
16 | 16 | ||
17 | You should have received a copy of the GNU General Public License | 17 | You should have received a copy of the GNU General Public License |
18 | along with GDBM. If not, see <http://www.gnu.org/licenses/>. */ | 18 | along with GDBM. If not, see <http://www.gnu.org/licenses/>. */ |
19 | 19 | ||
20 | /* Include system configuration before all else. */ | 20 | /* Include system configuration before all else. */ |
21 | #include "autoconf.h" | 21 | #include "autoconf.h" |
22 | 22 | ||
23 | #include "gdbmdefs.h" | 23 | #include "gdbmdefs.h" |
24 | 24 | ||
25 | 25 | int | |
26 | gdbm_bucket_element_valid_p (GDBM_FILE dbf, int elem_loc) | ||
27 | { | ||
28 | return | ||
29 | elem_loc < dbf->header->bucket_elems | ||
30 | && dbf->bucket->h_table[elem_loc].hash_value != -1 | ||
31 | && dbf->bucket->h_table[elem_loc].key_size >= 0 | ||
32 | && off_t_sum_ok (dbf->bucket->h_table[elem_loc].data_pointer, | ||
33 | dbf->bucket->h_table[elem_loc].key_size) | ||
34 | && dbf->bucket->h_table[elem_loc].data_size >= 0 | ||
35 | && off_t_sum_ok (dbf->bucket->h_table[elem_loc].data_pointer | ||
36 | + dbf->bucket->h_table[elem_loc].key_size, | ||
37 | dbf->bucket->h_table[elem_loc].data_size); | ||
38 | } | ||
39 | |||
26 | /* Read the data found in bucket entry ELEM_LOC in file DBF and | 40 | /* Read the data found in bucket entry ELEM_LOC in file DBF and |
27 | return a pointer to it. Also, cache the read value. */ | 41 | return a pointer to it. Also, cache the read value. */ |
28 | 42 | ||
29 | char * | 43 | char * |
30 | _gdbm_read_entry (GDBM_FILE dbf, int elem_loc) | 44 | _gdbm_read_entry (GDBM_FILE dbf, int elem_loc) |
31 | { | 45 | { |
32 | int rc; | 46 | int rc; |
33 | int key_size; | 47 | int key_size; |
34 | int data_size; | 48 | int data_size; |
35 | off_t file_pos; | 49 | off_t file_pos; |
36 | data_cache_elem *data_ca; | 50 | data_cache_elem *data_ca; |
37 | 51 | ||
38 | /* Is it already in the cache? */ | 52 | /* Is it already in the cache? */ |
39 | if (dbf->cache_entry->ca_data.elem_loc == elem_loc) | 53 | if (dbf->cache_entry->ca_data.elem_loc == elem_loc) |
40 | return dbf->cache_entry->ca_data.dptr; | 54 | return dbf->cache_entry->ca_data.dptr; |
41 | 55 | ||
56 | if (!gdbm_bucket_element_valid_p (dbf, elem_loc)) | ||
57 | { | ||
58 | GDBM_SET_ERRNO (dbf, GDBM_BAD_HASH_TABLE, TRUE); | ||
59 | return NULL; | ||
60 | } | ||
61 | |||
42 | /* Set sizes and pointers. */ | 62 | /* Set sizes and pointers. */ |
43 | key_size = dbf->bucket->h_table[elem_loc].key_size; | 63 | key_size = dbf->bucket->h_table[elem_loc].key_size; |
44 | data_size = dbf->bucket->h_table[elem_loc].data_size; | 64 | data_size = dbf->bucket->h_table[elem_loc].data_size; |
45 | data_ca = &dbf->cache_entry->ca_data; | 65 | data_ca = &dbf->cache_entry->ca_data; |
46 | 66 | ||
47 | /* Set up the cache. */ | 67 | /* Set up the cache. */ |
48 | if (data_ca->dptr != NULL) free (data_ca->dptr); | 68 | if (data_ca->dptr != NULL) free (data_ca->dptr); |
49 | data_ca->key_size = key_size; | 69 | data_ca->key_size = key_size; |
50 | data_ca->data_size = data_size; | 70 | data_ca->data_size = data_size; |
51 | data_ca->elem_loc = elem_loc; | 71 | data_ca->elem_loc = elem_loc; |
52 | data_ca->hash_val = dbf->bucket->h_table[elem_loc].hash_value; | 72 | data_ca->hash_val = dbf->bucket->h_table[elem_loc].hash_value; |
53 | 73 | ||
diff --git a/src/gdbm.h.in b/src/gdbm.h.in index 61d5707..e576c69 100644 --- a/src/gdbm.h.in +++ b/src/gdbm.h.in | |||
@@ -143,24 +143,25 @@ typedef struct gdbm_recovery_s | |||
143 | void *data; | 143 | void *data; |
144 | 144 | ||
145 | size_t max_failed_keys; | 145 | size_t max_failed_keys; |
146 | size_t max_failed_buckets; | 146 | size_t max_failed_buckets; |
147 | size_t max_failures; | 147 | size_t max_failures; |
148 | 148 | ||
149 | /* Output members. | 149 | /* Output members. |
150 | The gdbm_recover function fills these before returning. */ | 150 | The gdbm_recover function fills these before returning. */ |
151 | size_t recovered_keys; | 151 | size_t recovered_keys; |
152 | size_t recovered_buckets; | 152 | size_t recovered_buckets; |
153 | size_t failed_keys; | 153 | size_t failed_keys; |
154 | size_t failed_buckets; | 154 | size_t failed_buckets; |
< |