summaryrefslogtreecommitdiff
path: root/src/gdbmseq.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2021-09-19 09:15:48 +0300
committerSergey Poznyakoff <gray@gnu.org>2021-09-19 09:15:48 +0300
commitca7194987388a825f57fdebd73eb9c491a8749b0 (patch)
treee430121a0f27c2de1a9709231d4bf43a946c6b0a /src/gdbmseq.c
parent8952f7fd7cebffbe4ecf8c232e4435c5de72678a (diff)
downloadgdbm-ca7194987388a825f57fdebd73eb9c491a8749b0.tar.gz
Fix key verification in sequential access.
This fixes https://oss-fuzz.com/testcase-detail/6317999997452288 and improves 4046a0af. * src/bucket.c (gdbm_dir_entry_valid_p): Move to proto. * src/proto.h (gdbm_dir_entry_valid_p): New inline function. * src/gdbmseq.c (gdbm_valid_key_p): Use gdbm_dir_entry_valid_p to validate the buffer index. Reorder the checks.
Diffstat (limited to 'src/gdbmseq.c')
-rw-r--r--src/gdbmseq.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/gdbmseq.c b/src/gdbmseq.c
index ef40c40..956ba2b 100644
--- a/src/gdbmseq.c
+++ b/src/gdbmseq.c
@@ -26,12 +26,13 @@ gdbm_valid_key_p (GDBM_FILE dbf, char *key_ptr, int key_size, int elem_loc)
{
datum key;
int hash, bucket, offset;
-
+
key.dptr = key_ptr;
key.dsize = key_size;
_gdbm_hash_key (dbf, key, &hash, &bucket, &offset);
- if (hash == dbf->bucket->h_table[elem_loc].hash_value &&
- dbf->dir[bucket] == dbf->dir[dbf->bucket_dir])
+ if (gdbm_dir_entry_valid_p (dbf, bucket) &&
+ dbf->dir[bucket] == dbf->dir[dbf->bucket_dir] &&
+ hash == dbf->bucket->h_table[elem_loc].hash_value)
return 1;
GDBM_SET_ERRNO (dbf, GDBM_BAD_HASH_ENTRY, TRUE);
return 0;