set initial volume from mute to default volume
[apps/agl-service-unicens.git] / ucs2-interface / ucs-xml / UcsXml.c
index c86746f..4c392cd 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
@@ -651,29 +710,30 @@ static ParseResult_t ParseAll(mxml_node_t *tree, UcsXmlVal_t *ucs, PrivateData_t
         if (Parse_Success != (result = ParseNode(sub, priv)))\r
             return result;\r
         /*/Iterate all connections. Node without any connection is also valid.*/\r
-        if (!GetElementArray(sub->child, ALL_CONNECTIONS, &conType, &con))\r
-            continue;\r
-        while(con)\r
+        if (GetElementArray(sub->child, ALL_CONNECTIONS, &conType, &con))\r
         {\r
-            const char *socTypeStr;\r
-            MSocketType_t socType;\r
-            mxml_node_t *soc;\r
-            memset(&priv->conData, 0, sizeof(ConnectionData_t));\r
-            if (Parse_Success != (result = ParseConnection(con, conType, priv)))\r
-                return result;\r
-            /*Iterate all sockets*/\r
-            if(!GetElementArray(con->child, ALL_SOCKETS, &socTypeStr, &soc)) RETURN_ASSERT(Parse_XmlError);\r
-            while(soc)\r
+            while(con)\r
             {\r
-                if (!GetSocketType(socTypeStr, &socType)) RETURN_ASSERT(Parse_XmlError);\r
-                if (Parse_Success != (result = ParseSocket(soc, (0 == priv->conData.sockCnt), socType, &priv->conData.jobList, priv)))\r
+                const char *socTypeStr;\r
+                MSocketType_t socType;\r
+                mxml_node_t *soc;\r
+                memset(&priv->conData, 0, sizeof(ConnectionData_t));\r
+                if (Parse_Success != (result = ParseConnection(con, conType, priv)))\r
                     return result;\r
-                ++priv->conData.sockCnt;\r
-                if(!GetElementArray(soc, ALL_SOCKETS, &socTypeStr, &soc))\r
+                /*Iterate all sockets*/\r
+                if(!GetElementArray(con->child, ALL_SOCKETS, &socTypeStr, &soc)) RETURN_ASSERT(Parse_XmlError);\r
+                while(soc)\r
+                {\r
+                    if (!GetSocketType(socTypeStr, &socType)) RETURN_ASSERT(Parse_XmlError);\r
+                    if (Parse_Success != (result = ParseSocket(soc, (0 == priv->conData.sockCnt), socType, &priv->conData.jobList, priv)))\r
+                        return result;\r
+                    ++priv->conData.sockCnt;\r
+                    if(!GetElementArray(soc, ALL_SOCKETS, &socTypeStr, &soc))\r
+                        break;\r
+                }\r
+                if(!GetElementArray(con, ALL_CONNECTIONS, &conType, &con))\r
                     break;\r
             }\r
-            if(!GetElementArray(con, ALL_CONNECTIONS, &conType, &con))\r
-                break;\r
         }\r
         ++ucs->nodSize;\r
         if (!GetElement(sub, NODE, false, &sub, false))\r