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
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
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
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