]> Cypherpunks repositories - keks.git/commitdiff
Check number of schema command arguments
authorSergey Matveev <stargrave@stargrave.org>
Fri, 4 Apr 2025 10:05:06 +0000 (13:05 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Fri, 4 Apr 2025 10:05:06 +0000 (13:05 +0300)
c/lib/schema.c

index b9045d2005389a199b36c96f51b528f530dad03a6c8facfd3824b756462651b9..6324b6b0e6193a20d50104f65c431eb060bdb8b216430183d6314345bc0aa4db 100644 (file)
@@ -177,6 +177,11 @@ Eached:
         err.code = KEKSSchemaErrNo;
     } else if (KEKSStrEqual(&(schema->list[idxSchema].atom), CmdTake)) {
         idxSchema = schema->list[idxSchema].next;
+        if (idxSchema == 0) {
+            err.code = KEKSSchemaErrInvalidSchema;
+            err.msg = "wrong number of args";
+            return err;
+        }
         err.offSchema = schema->offsets[idxSchema];
         switch (schema->list[idxSchema].atom.typ) {
         case KEKSItemStr:
@@ -285,6 +290,11 @@ Eached:
         enum KEKSItemType expected[16] = {KEKSItemInvalid};
         size_t idxExpected = 0;
         idxSchema = schema->list[idxSchema].next;
+        if (idxSchema == 0) {
+            err.code = KEKSSchemaErrInvalidSchema;
+            err.msg = "wrong number of args";
+            return err;
+        }
         while (idxSchema != 0) {
             err.offSchema = schema->offsets[idxSchema];
             if (schema->list[idxSchema].atom.typ != KEKSItemStr) {
@@ -355,6 +365,11 @@ Eached:
             err.code = KEKSSchemaErrNo;
         } else {
             idxSchema = schema->list[idxSchema].next;
+            if (idxSchema == 0) {
+                err.code = KEKSSchemaErrInvalidSchema;
+                err.msg = "wrong number of args";
+                return err;
+            }
             err.offSchema = schema->offsets[idxSchema];
             err.offData = data->offsets[*taken];
             int64_t our = 0;
@@ -372,6 +387,11 @@ Eached:
             err.code = KEKSSchemaErrNo;
         } else {
             idxSchema = schema->list[idxSchema].next;
+            if (idxSchema == 0) {
+                err.code = KEKSSchemaErrInvalidSchema;
+                err.msg = "wrong number of args";
+                return err;
+            }
             err.offSchema = schema->offsets[idxSchema];
             err.offData = data->offsets[*taken];
             int64_t our = 0;
@@ -385,6 +405,11 @@ Eached:
         }
     } else if (KEKSStrEqual(&(schema->list[idxSchema].atom), CmdSchema)) {
         idxSchema = schema->list[idxSchema].next;
+        if (idxSchema == 0) {
+            err.code = KEKSSchemaErrInvalidSchema;
+            err.msg = "wrong number of args";
+            return err;
+        }
         err.offSchema = schema->offsets[idxSchema];
         if (schema->list[idxSchema].atom.typ != KEKSItemStr) {
             err.code = KEKSSchemaErrInvalidSchema;
@@ -415,6 +440,11 @@ Eached:
         }
     } else if (KEKSStrEqual(&(schema->list[idxSchema].atom), CmdTimeMaxPrec)) {
         idxSchema = schema->list[idxSchema].next;
+        if (idxSchema == 0) {
+            err.code = KEKSSchemaErrInvalidSchema;
+            err.msg = "wrong number of args";
+            return err;
+        }
         err.offSchema = schema->offsets[idxSchema];
         if (schema->list[idxSchema].atom.typ != KEKSItemPint) {
             err.code = KEKSSchemaErrInvalidSchema;