Improve integer handling
authorThorsten Kummermehr <thorsten.kummermehr@k2l.de>
Tue, 7 Nov 2017 15:13:52 +0000 (16:13 +0100)
committerThorsten Kummermehr <thorsten.kummermehr@k2l.de>
Tue, 7 Nov 2017 15:13:52 +0000 (16:13 +0100)
ucs2-interface/ucs-xml/UcsXml.c

index c86746f..3078749 100644 (file)
@@ -232,6 +232,7 @@ static bool GetElementArray(mxml_node_t *element, const char *array[], const cha
 static bool GetCount(mxml_node_t *element, const char *name, uint32_t *out, bool mandatory);\r
 static bool GetCountArray(mxml_node_t *element, const char *array[], uint32_t *out, bool mandatory);\r
 static bool GetString(mxml_node_t *element, const char *key, const char **out, bool mandatory);\r
+static bool CheckInteger(const char *val, bool forceHex);\r
 static bool GetUInt16(mxml_node_t *element, const char *key, uint16_t *out, bool mandatory);\r
 static bool GetUInt8(mxml_node_t *element, const char *key, uint8_t *out, bool mandatory);\r
 static bool GetSocketType(const char *txt, MSocketType_t *out);\r
@@ -419,19 +420,70 @@ static bool GetString(mxml_node_t *element, const char *key, const char **out, b
     return false;\r
 }\r
 \r
+static bool CheckInteger(const char *value, bool forceHex)\r
+{\r
+    bool hex = forceHex;\r
+    int32_t len;\r
+    if (!value) return false;\r
+    len = strlen(value);\r
+    if (len >= 3 && '0' == value[0] && 'x' == value[1])\r
+    {\r
+        hex = true;\r
+        value += 2;\r
+    }\r
+    while(value[0])\r
+    {\r
+        bool valid = false;\r
+        uint8_t v = value[0];\r
+        if (v >= '0' && v <= '9') valid = true;\r
+        if (hex)\r
+        {\r
+            if (v >= 'a' && v <= 'f') valid = true;\r
+            if (v >= 'A' && v <= 'F') valid = true;\r
+        }\r
+        if (!valid) return false;\r
+        ++value;\r
+    }\r
+    return true;\r
+}\r
+\r
 static bool GetUInt16(mxml_node_t *element, const char *key, uint16_t *out, bool mandatory)\r
 {\r
+    long int value;\r
     const char* txt;\r
     if (!GetString(element, key, &txt, mandatory)) return false;\r
-    *out = strtol( txt, NULL, 0 );\r
+    if (!CheckInteger(txt, false))\r
+    {\r
+        UcsXml_CB_OnError("key='%s' contained invalid integer='%s'", 2, key, txt);\r
+        return false;\r
+    }\r
+    value = strtol( txt, NULL, 0 );\r
+    if (value > 0xFFFF)\r
+    {\r
+        UcsXml_CB_OnError("key='%s' is out of range='%d'", 2, key, value);\r
+        return false;\r
+    }\r
+    *out = value;\r
     return true;\r
 }\r
 \r
 static bool GetUInt8(mxml_node_t *element, const char *key, uint8_t *out, bool mandatory)\r
 {\r
+    long int value;\r
     const char* txt;\r
     if (!GetString(element, key, &txt, mandatory)) return false;\r
-    *out = strtol( txt, NULL, 0 );\r
+    if (!CheckInteger(txt, false))\r
+    {\r
+        UcsXml_CB_OnError("key='%s' contained invalid integer='%s'", 2, key, txt);\r
+        return false;\r
+    }\r
+    value = strtol( txt, NULL, 0 );\r
+    if (value > 0xFF)\r
+    {\r
+        UcsXml_CB_OnError("key='%s' is out of range='%d'", 2, key, value);\r
+        return false;\r
+    }\r
+    *out = value;\r
     return true;\r
 }\r
 \r
@@ -509,6 +561,13 @@ static bool GetPayload(mxml_node_t *element, const char *name, uint8_t **pPayloa
             assert(false);\r
             return 0;\r
         }\r
+        if (!CheckInteger(token, true))\r
+        {\r
+            UcsXml_CB_OnError("Script payload contains non valid hex number='%s'", 1, token);\r
+            free(txtCopy);\r
+            assert(false);\r
+            return 0;\r
+        }\r
         p[offset + len++] = strtol( token, NULL, 16 );\r
         token = strtok_r( NULL, " ,.-", &tkPtr );\r
     }\r