]> mj.ucw.cz Git - libucw.git/commitdiff
Fix return values.
authorMartin Mares <mj@ucw.cz>
Fri, 19 Nov 1999 18:09:44 +0000 (18:09 +0000)
committerMartin Mares <mj@ucw.cz>
Fri, 19 Nov 1999 18:09:44 +0000 (18:09 +0000)
lib/db.c
lib/db.h

index fee956b14b849e9b9d2c4569d1898a9a278b8969..638d19b38e34fe2389035f8ca2d179edeea94b23 100644 (file)
--- 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;
        }
index 886b8f4b314f577805ec4a19b12a68fccdee8953..cd24b90831cb9f5eda80d6a6ef8b5d59130e004e 100644 (file)
--- 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