]> Cypherpunks repositories - keks.git/commitdiff
Signed length is safer
authorSergey Matveev <stargrave@stargrave.org>
Sun, 6 Oct 2024 09:39:24 +0000 (12:39 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sun, 6 Oct 2024 09:39:24 +0000 (12:39 +0300)
cyac/dec.c
cyac/dec.h
cyac/example/print-map.c
cyac/iter.c
cyac/iter.h

index d8030f8b5d32eafeab7e974ccd87bc8f3b69a12f0c73fd367b02475ed5e1bb8f..22cc80307adc8b742d21d0254e343c273c6a2f6a2c45b22fc0faa95c5ccabc9a 100644 (file)
@@ -47,7 +47,7 @@ YACAtomDecode(struct YACAtom *atom, const unsigned char *buf, const size_t len)
         }
         if (ll != 0) {
             atom->off += ll;
-            if (len < atom->off) {
+            if ((ptrdiff_t)len < atom->off) {
                 return YACErrNotEnough;
             }
             l = yacFromBE(buf + 1, ll);
@@ -60,7 +60,7 @@ YACAtomDecode(struct YACAtom *atom, const unsigned char *buf, const size_t len)
             }
         }
         atom->off += l;
-        if (len < atom->off) {
+        if ((ptrdiff_t)len < atom->off) {
             return YACErrNotEnough;
         }
         atom->len = l;
@@ -96,7 +96,7 @@ YACAtomDecode(struct YACAtom *atom, const unsigned char *buf, const size_t len)
                                                                        YACItemUint;
         const size_t l = (atom->tag & 0x0F) + 1;
         atom->off += l;
-        if (len < atom->off) {
+        if ((ptrdiff_t)len < atom->off) {
             return YACErrNotEnough;
         }
         if (buf[1] == 0) {
@@ -135,7 +135,7 @@ YACAtomDecode(struct YACAtom *atom, const unsigned char *buf, const size_t len)
     case YACAtomUUID:
         atom->typ = YACItemUUID;
         atom->off += 16;
-        if (len < atom->off) {
+        if ((ptrdiff_t)len < atom->off) {
             return YACErrNotEnough;
         }
         atom->len = 16;
@@ -177,7 +177,7 @@ YACAtomDecode(struct YACAtom *atom, const unsigned char *buf, const size_t len)
         }
         atom->typ = YACItemFloat;
         atom->off += l;
-        if (len < atom->off) {
+        if ((ptrdiff_t)len < atom->off) {
             return YACErrNotEnough;
         }
         atom->typ = YACItemRaw;
@@ -203,7 +203,7 @@ YACAtomDecode(struct YACAtom *atom, const unsigned char *buf, const size_t len)
         }
         atom->typ = YACItemTAI64;
         atom->off += l;
-        if (len < atom->off) {
+        if ((ptrdiff_t)len < atom->off) {
             return YACErrNotEnough;
         }
         atom->len = l;
index f77b53a49fe73388875df08953ac06511c2155426b6be05b800e167f74567324..b483f4f0d2da6e4b6516093ab7f53bdf166319220cb74e81bc10fd9147555677 100644 (file)
@@ -48,8 +48,8 @@ enum YACErr {
 };
 
 struct YACAtom {
-    size_t off; // length of the whole atom
-    size_t len; // length of the strings, TAI64, raw values
+    ptrdiff_t off; // length of the whole atom
+    size_t len;    // length of the strings, TAI64, raw values
     union {
         uint64_t uint;            // unsigned integer's value
         int64_t sint;             // signed integer's value
index 632feb0268c32cd2442e95672d1fef86ebb6e5796677ab4d316e6dac47bf7cfe..f1457345949d83f45bfc4480ec540be0ee7a24d33f80106495e425c6f7ebd3ae 100644 (file)
@@ -58,7 +58,7 @@ myCb(
     const size_t idx,
     void *cbState,
     struct YACAtom *atom,
-    size_t *off,
+    ptrdiff_t *off,
     const unsigned char *buf,
     const size_t len)
 {
@@ -234,7 +234,7 @@ main(int argc, char **argv)
     }
     struct YACAtom atom;
     memset(&atom, 0, sizeof(struct YACAtom));
-    size_t off = 0;
+    ptrdiff_t off = 0;
     enum YACErr err = YACAtomDecode(&atom, buf, len);
     if (err != YACErrNo) {
         fprintf(stderr, "map err: %d\n", err);
index 7ac832bf511602848e79997731cf0c9462f8e16e747bfde6693334d94297a863..89f5ce9a6d165e37774f76df97470733ac02fe073b3d98baeb80e1f78c7fa8d3 100644 (file)
@@ -24,7 +24,7 @@ enum YACErr
 YACIterList(
     void *cbState,
     struct YACAtom *atom,
-    size_t *off,
+    ptrdiff_t *off,
     const unsigned char *buf,
     const size_t len,
     YACIterCb cb)
@@ -32,7 +32,7 @@ YACIterList(
     enum YACErr err = YACErrInvalid;
     bool eoc = false;
     for (size_t n = 0;; n++) {
-        err = YACAtomDecode(atom, buf + *off, len - *off);
+        err = YACAtomDecode(atom, buf + *off, (size_t)((ptrdiff_t)len - *off));
         if (err != YACErrNo) {
             return err;
         }
@@ -53,7 +53,7 @@ enum YACErr
 YACIterMap(
     void *cbState,
     struct YACAtom *atom,
-    size_t *off,
+    ptrdiff_t *off,
     const unsigned char *buf,
     const size_t len,
     YACIterCb cb)
@@ -62,7 +62,7 @@ YACIterMap(
     size_t keyLen = 0;
     enum YACErr err = YACErrInvalid;
     for (;;) {
-        err = YACAtomDecode(atom, buf + *off, len - *off);
+        err = YACAtomDecode(atom, buf + *off, (size_t)((ptrdiff_t)len - *off));
         if (err != YACErrNo) {
             return err;
         }
@@ -85,7 +85,7 @@ YACIterMap(
         }
         keyLen = atom->len;
         key = atom->val.buf;
-        err = YACAtomDecode(atom, buf + *off, len - *off);
+        err = YACAtomDecode(atom, buf + *off, (size_t)((ptrdiff_t)len - *off));
         if (err != YACErrNo) {
             return err;
         }
@@ -105,12 +105,12 @@ enum YACErr
 YACIterBlob(
     void *cbState,
     struct YACAtom *atom,
-    size_t *off,
+    ptrdiff_t *off,
     const unsigned char *buf,
     const size_t len,
     YACIterCb cb)
 {
-    enum YACErr err = YACAtomDecode(atom, buf + *off, len - *off);
+    enum YACErr err = YACAtomDecode(atom, buf + *off, (size_t)((ptrdiff_t)len - *off));
     if (err != YACErrNo) {
         return err;
     }
@@ -129,14 +129,14 @@ YACIterBlob(
     }
     bool eoc = false;
     for (size_t n = 0; !eoc; n++) {
-        err = YACAtomDecode(atom, buf + *off, len - *off);
+        err = YACAtomDecode(atom, buf + *off, (size_t)((ptrdiff_t)len - *off));
         if (err != YACErrNo) {
             return err;
         }
         (*off) += atom->off;
         switch (atom->typ) {
         case YACItemNIL:
-            if ((len - *off) <= chunkLen) {
+            if (((ptrdiff_t)len - *off) <= (ptrdiff_t)chunkLen) {
                 return YACErrBlobShortChunk;
             }
             atom->val.buf = buf + *off;
index 268d1518fcb0a8d23c46816a9a39fc34c7018a5d1a1e853168ca9dcafad6a230..37019af46ecc03cb452376745dcd88de1c6d3b8342f704a9730b357f19f16075 100644 (file)
@@ -11,7 +11,7 @@ typedef enum YACErr (*YACIterCb)(
     const size_t idx,
     void *cbState,
     struct YACAtom *atom,
-    size_t *off,
+    ptrdiff_t *off,
     const unsigned char *buf,
     const size_t len);
 
@@ -19,7 +19,7 @@ enum YACErr
 YACIterList(
     void *cbState,
     struct YACAtom *atom,
-    size_t *off,
+    ptrdiff_t *off,
     const unsigned char *buf,
     const size_t len,
     YACIterCb cb);
@@ -28,7 +28,7 @@ enum YACErr
 YACIterMap(
     void *cbState,
     struct YACAtom *atom,
-    size_t *off,
+    ptrdiff_t *off,
     const unsigned char *buf,
     const size_t len,
     YACIterCb cb);
@@ -37,7 +37,7 @@ enum YACErr
 YACIterBlob(
     void *cbState,
     struct YACAtom *atom,
-    size_t *off,
+    ptrdiff_t *off,
     const unsigned char *buf,
     const size_t len,
     YACIterCb cb);