From ebfbdfc74098f7d097bc6ccab82cba2eb13eefde Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Fri, 19 Nov 1999 18:09:44 +0000 Subject: [PATCH] Fix return values. --- lib/db.c | 9 +++++++-- lib/db.h | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/db.c b/lib/db.c index fee956b1..638d19b3 100644 --- a/lib/db.c +++ b/lib/db.c @@ -419,7 +419,7 @@ sdbm_access(struct sdbm *d, byte *key, uns keylen, byte *val, uns *vallen, uns m if ((d->key_size >= 0 && keylen != (uns) d->key_size) || keylen > 65535) return SDBM_ERROR_BAD_KEY_SIZE; - if (val && ((d->val_size >= 0 && *vallen != (uns) d->val_size) || *vallen >= 65535)) + if (val && ((d->val_size >= 0 && *vallen != (uns) d->val_size) || *vallen >= 65535) && mode) return SDBM_ERROR_BAD_VAL_SIZE; if (!mode && !(d->flags & SDBM_WRITE)) return SDBM_ERROR_READ_ONLY; @@ -448,7 +448,7 @@ sdbm_access(struct sdbm *d, byte *key, uns keylen, byte *val, uns *vallen, uns m case 0: /* fetch: found */ rc = sdbm_put_user(D, Dl, val, vallen); pgc_put(d->cache, q); - return rc ? 1 : SDBM_ERROR_TOO_LARGE; + return rc ? SDBM_ERROR_TOO_LARGE : 1; case 1: /* store: already present */ pgc_put(d->cache, q); return 0; @@ -473,6 +473,11 @@ insert: while (b->used + size > d->page_size - sizeof(struct sdbm_bucket)) { /* Page overflow, need to split */ + if (size >= d->page_size - sizeof(struct sdbm_bucket)) + { + pgc_put(d->cache, q); + return SDBM_ERROR_GIANT; + } q = sdbm_split_page(d, q, hash, h); b = (void *) q->data; } diff --git a/lib/db.h b/lib/db.h index 886b8f4b..cd24b908 100644 --- a/lib/db.h +++ b/lib/db.h @@ -41,5 +41,6 @@ void sdbm_sync(struct sdbm *); #define SDBM_ERROR_BAD_VAL_SIZE -2 /* Fixed value size doesn't match */ #define SDBM_ERROR_TOO_LARGE -3 /* Key/value doesn't fit in buffer supplied */ #define SDBM_ERROR_READ_ONLY -4 /* Database has been opened read only */ +#define SDBM_ERROR_GIANT -5 /* Key/value too large to fit in a page */ #endif -- 2.39.2