aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am16
-rw-r--r--NEWS31
-rw-r--r--src/findkey.c24
-rw-r--r--src/gdbm.h.in4
-rw-r--r--src/gdbmdefs.h17
-rw-r--r--src/gdbmerrno.c3
-rw-r--r--src/gdbmtool.c27
-rw-r--r--src/mmap.c22
-rw-r--r--src/recover.c32
-rw-r--r--src/systems.h1
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
@@ -21,18 +21,32 @@ if COMPAT_OPT
21 MAYBE_COMPAT = compat 21 MAYBE_COMPAT = compat
22endif 22endif
23SUBDIRS = po src doc $(MAYBE_COMPAT) tests 23SUBDIRS = po src doc $(MAYBE_COMPAT) tests
24 24
25AM_DISTCHECK_CONFIGURE_FLAGS = --enable-libgdbm-compat 25AM_DISTCHECK_CONFIGURE_FLAGS = --enable-libgdbm-compat
26 26
27dist-hook: 27.PHONY: set-dist-date
28set-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
34dist-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
33gen_start_date = 2016-07-08 47gen_start_date = 2016-07-08
34prev_change_log = ChangeLog.cvs 48prev_change_log = ChangeLog.cvs
35 49
36.PHONY: ChangeLog 50.PHONY: ChangeLog
37ChangeLog: 51ChangeLog:
38 $(AM_V_GEN)if test -d .git; then \ 52 $(AM_V_GEN)if test -d .git; then \
diff --git a/NEWS b/NEWS
index e004eec..24180d8 100644
--- a/NEWS
+++ b/NEWS
@@ -1,20 +1,49 @@
1GNU dbm NEWS -- history of user-visible changes. 2018-05-19 1GNU dbm NEWS -- history of user-visible changes. 2018-05-24
2Copyright (C) 1990-2018 Free Software Foundation, Inc. 2Copyright (C) 1990-2018 Free Software Foundation, Inc.
3See the end of file for copying conditions. 3See the end of file for copying conditions.
4 4
5Please send gdbm bug reports to <bug-gdbm@gnu.org>. 5Please send gdbm bug reports to <bug-gdbm@gnu.org>.
6 6
7Version 1.14.90 7Version 1.14.90
8 8
9FIXME: 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
19The syntax is:
20
21 gdbmtool DBNAME COMMAND [ARGS...]
22
23Multiple commands are separated by semicolon (take care to escape it),
24e.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
32Upon return from gdbm_recover, this member holds the number of keys
33that were not recovered, because the same key has already been stored
34in the database. The actual number of stored keys is thus
35recovered_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
16Version 1.14.1 - 2018-01-03 45Version 1.14.1 - 2018-01-03
17 46
18* Increment soname current version number. 47* Increment soname current version number.
19 48
20 49
diff --git a/src/findkey.c b/src/findkey.c
index 7638b04..bd9fd83 100644
--- a/src/findkey.c
+++ b/src/findkey.c
@@ -19,29 +19,49 @@
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 25int
26gdbm_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
29char * 43char *
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. */
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
@@ -149,12 +149,13 @@ typedef struct gdbm_recovery_s
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;
155 size_t duplicate_keys;
155 char *backup_name; 156 char *backup_name;
156} gdbm_recovery; 157} gdbm_recovery;
157 158
158#define GDBM_RCVR_DEFAULT 0x00 /* Default settings */ 159#define GDBM_RCVR_DEFAULT 0x00 /* Default settings */
159#define GDBM_RCVR_ERRFUN 0x01 /* errfun is initialized */ 160#define GDBM_RCVR_ERRFUN 0x01 /* errfun is initialized */
160#define GDBM_RCVR_MAX_FAILED_KEYS 0x02 /* max_failed_keys is initialized */ 161#define GDBM_RCVR_MAX_FAILED_KEYS 0x02 /* max_failed_keys is initialized */
@@ -219,15 +220,16 @@ extern int gdbm_copy_meta (GDBM_FILE dst, GDBM_FILE src);
219# define GDBM_NEED_RECOVERY 29 220# define GDBM_NEED_RECOVERY 29
220# define GDBM_BACKUP_FAILED 30 221# define GDBM_BACKUP_FAILED 30
221# define GDBM_DIR_OVERFLOW 31 222# define GDBM_DIR_OVERFLOW 31
222# define GDBM_BAD_BUCKET 32 223# define GDBM_BAD_BUCKET 32
223# define GDBM_BAD_HEADER 33 224# define GDBM_BAD_HEADER 33
224# define GDBM_BAD_AVAIL 34 225# define GDBM_BAD_AVAIL 34
226# define GDBM_BAD_HASH_TABLE 35
225 227
226# define _GDBM_MIN_ERRNO 0 228# define _GDBM_MIN_ERRNO 0
227# define _GDBM_MAX_ERRNO GDBM_BAD_AVAIL 229# define _GDBM_MAX_ERRNO GDBM_BAD_HASH_TABLE
228 230
229/* This one was never used and will be removed in the future */ 231/* This one was never used and will be removed in the future */
230# define GDBM_UNKNOWN_UPDATE GDBM_UNKNOWN_ERROR 232# define GDBM_UNKNOWN_UPDATE GDBM_UNKNOWN_ERROR
231 233
232typedef int gdbm_error; 234typedef int gdbm_error;
233extern int *gdbm_errno_location (void); 235extern int *gdbm_errno_location (void);
diff --git a/src/gdbmdefs.h b/src/gdbmdefs.h
index 5305b0d..1bb519b 100644
--- a/src/gdbmdefs.h
+++ b/src/gdbmdefs.h
@@ -23,12 +23,28 @@
23#define DEFAULT_TEXT_DOMAIN PACKAGE 23#define DEFAULT_TEXT_DOMAIN PACKAGE
24#include "gettext.h" 24#include "gettext.h"
25 25
26#define _(s) gettext (s) 26#define _(s) gettext (s)
27#define N_(s) s 27#define N_(s) s
28 28
29/* The width in bits of the integer type or expression T. */
30#define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT)
31
32#define SIGNED_TYPE_MAXIMUM(t) \
33 ((t) ((((t) 1 << (TYPE_WIDTH (t) - 2)) - 1) * 2 + 1))
34
35/* Maximum value for off_t */
36#define OFF_T_MAX SIGNED_TYPE_MAXIMUM (off_t)
37
38/* Return true if A can be added to B without integer overflow */
39static inline off_t
40off_t_sum_ok (off_t a, off_t b)