소스 검색

Util: UA_NodeId_toString set correct string length

Stefan Profanter 5 년 전
부모
커밋
8e85b9de3e
2개의 변경된 파일21개의 추가작업 그리고 7개의 파일을 삭제
  1. 20 6
      src/ua_util.c
  2. 1 1
      tests/check_utils.c

+ 20 - 6
src/ua_util.c

@@ -205,11 +205,16 @@ UA_NodeId_toString(const UA_NodeId *nodeId, UA_String *nodeIdStr) {
         return UA_STATUSCODE_GOOD;
 
     char *nsStr = NULL;
+    long snprintfLen = 0;
     size_t nsLen = 0;
     if (nodeId->namespaceIndex != 0) {
         nsStr = (char*)UA_malloc(9+1); // strlen("ns=XXXXX;") = 9 + Nullbyte
-        UA_snprintf(nsStr, 10, "ns=%d;", nodeId->namespaceIndex);
-        nsLen = strlen(nsStr);
+        snprintfLen = UA_snprintf(nsStr, 10, "ns=%d;", nodeId->namespaceIndex);
+        if (snprintfLen < 0 || snprintfLen >= 10) {
+            UA_free(nsStr);
+            return UA_STATUSCODE_BADINTERNALERROR;
+        }
+        nsLen = (size_t)(snprintfLen);
     }
 
 
@@ -224,7 +229,7 @@ UA_NodeId_toString(const UA_NodeId *nodeId, UA_String *nodeIdStr) {
                 UA_free(nsStr);
                 return UA_STATUSCODE_BADOUTOFMEMORY;
             }
-            UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%si=%lu",
+            snprintfLen =UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%si=%lu",
                         nsLen > 0 ? nsStr : "",
                         (unsigned long )nodeId->identifier.numeric);
             break;
@@ -237,7 +242,7 @@ UA_NodeId_toString(const UA_NodeId *nodeId, UA_String *nodeIdStr) {
                 UA_free(nsStr);
                 return UA_STATUSCODE_BADOUTOFMEMORY;
             }
-            UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%ss=%.*s",
+            snprintfLen =UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%ss=%.*s",
                         nsLen > 0 ? nsStr : "",
                         (int)nodeId->identifier.string.length, nodeId->identifier.string.data);
             break;
@@ -250,7 +255,7 @@ UA_NodeId_toString(const UA_NodeId *nodeId, UA_String *nodeIdStr) {
                 UA_free(nsStr);
                 return UA_STATUSCODE_BADOUTOFMEMORY;
             }
-            UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%sg=" UA_PRINTF_GUID_FORMAT,
+            snprintfLen = UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%sg=" UA_PRINTF_GUID_FORMAT,
                         nsLen > 0 ? nsStr : "",
                         UA_PRINTF_GUID_DATA(nodeId->identifier.guid));
             break;
@@ -265,13 +270,22 @@ UA_NodeId_toString(const UA_NodeId *nodeId, UA_String *nodeIdStr) {
                 UA_free(nsStr);
                 return UA_STATUSCODE_BADOUTOFMEMORY;
             }
-            UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%sb=%.*s",
+            snprintfLen = UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%sb=%.*s",
                         nsLen > 0 ? nsStr : "",
                         (int)byteStr.length, byteStr.data);
             UA_String_deleteMembers(&byteStr);
             break;
     }
     UA_free(nsStr);
+
+    if (snprintfLen < 0 || snprintfLen >= (long) nodeIdStr->length) {
+        UA_free(nodeIdStr->data);
+        nodeIdStr->data = NULL;
+        nodeIdStr->length = 0;
+        return UA_STATUSCODE_BADINTERNALERROR;
+    }
+    nodeIdStr->length = (size_t)snprintfLen;
+
     return UA_STATUSCODE_GOOD;
 }
 

+ 1 - 1
tests/check_utils.c

@@ -237,7 +237,7 @@ END_TEST
 
 static void assertNodeIdString(const UA_String *gotStr, const char* expectedStr) {
     size_t expectedStringLength = strlen(expectedStr);
-    ck_assert_uint_ge(gotStr->length, expectedStringLength);
+    ck_assert_uint_eq(gotStr->length, expectedStringLength);
     char *gotChars = (char*)UA_malloc(gotStr->length+1);
     memcpy(gotChars, gotStr->data, gotStr->length);
     gotChars[gotStr->length] = 0;