Quellcode durchsuchen

more conservative checking of empty variants; some cleanup

Julius Pfrommer vor 8 Jahren
Ursprung
Commit
843e6092a3
2 geänderte Dateien mit 28 neuen und 25 gelöschten Zeilen
  1. 3 3
      include/ua_types.h
  2. 25 22
      src/ua_types.c

+ 3 - 3
include/ua_types.h

@@ -164,7 +164,7 @@ typedef uint32_t UA_StatusCode;
 /** Forward Declaration of UA_DataType. See Section `Generic Type Handling`_
     for details. */
 struct UA_DataType;
-typedef struct UA_DataType UA_DataType; 
+typedef struct UA_DataType UA_DataType;
 
 /** The following functions are used for handling arrays of any data type. */
 
@@ -547,7 +547,7 @@ static UA_INLINE UA_Boolean
 UA_Variant_isScalar(const UA_Variant *v) {
     return (v->arrayLength == 0 && v->data > UA_EMPTY_ARRAY_SENTINEL);
 }
-    
+
 /* Set the variant to a scalar value that already resides in memory. The value takes on
  * the lifecycle of the variant and is deleted with it.
  *
@@ -697,7 +697,7 @@ typedef struct {
                                      only.*/
     UA_Boolean isArray       : 1; /* The member is an array */
 } UA_DataTypeMember;
-    
+
 struct UA_DataType {
 #ifdef UA_ENABLE_TYPENAMES
     const char *typeName;

+ 25 - 22
src/ua_types.c

@@ -235,7 +235,7 @@ static UA_StatusCode NodeId_copy(UA_NodeId const *src, UA_NodeId *dst, const UA_
 }
 
 UA_Boolean UA_NodeId_equal(const UA_NodeId *n1, const UA_NodeId *n2) {
-	if(n1->namespaceIndex != n2->namespaceIndex || n1->identifierType!=n2->identifierType)
+    if(n1->namespaceIndex != n2->namespaceIndex || n1->identifierType!=n2->identifierType)
         return false;
     switch(n1->identifierType) {
     case UA_NODEIDTYPE_NUMERIC:
@@ -323,7 +323,7 @@ ExtensionObject_copy(UA_ExtensionObject const *src, UA_ExtensionObject *dst, con
 static void Variant_deletemembers(UA_Variant *p, const UA_DataType *_) {
     if(p->storageType != UA_VARIANT_DATA)
         return;
-    if(p->data > UA_EMPTY_ARRAY_SENTINEL) {
+    if(p->type && p->data > UA_EMPTY_ARRAY_SENTINEL) {
         if(p->arrayLength == 0)
             p->arrayLength = 1;
         UA_Array_delete(p->data, p->arrayLength, p->type);
@@ -411,7 +411,7 @@ processRangeDefinition(const UA_Variant *v, const UA_NumericRange range, size_t
             found_contiguous = true;
             b = (range.dimensions[k].max - range.dimensions[k].min + 1) * running_dimssize;
             s = dims[k] * running_dimssize;
-        } 
+        }
         f += running_dimssize * range.dimensions[k].min;
         running_dimssize *= dims[k];
         if(k == 0)
@@ -552,11 +552,11 @@ UA_StatusCode UA_Variant_setScalarCopy(UA_Variant *v, const void *p, const UA_Da
     if(!new)
         return UA_STATUSCODE_BADOUTOFMEMORY;
     UA_StatusCode retval = UA_copy(p, new, type);
-	if(retval != UA_STATUSCODE_GOOD) {
-		UA_free(new);
+    if(retval != UA_STATUSCODE_GOOD) {
+        UA_free(new);
         //cppcheck-suppress memleak
-		return retval;
-	}
+        return retval;
+    }
     UA_Variant_setScalar(v, new, type);
     //cppcheck-suppress memleak
     return UA_STATUSCODE_GOOD;
@@ -578,7 +578,7 @@ UA_Variant_setArrayCopy(UA_Variant *v, const void *array,
     UA_StatusCode retval = UA_Array_copy(array, arraySize, &v->data, type);
     if(retval != UA_STATUSCODE_GOOD)
         return retval;
-    v->arrayLength = arraySize; 
+    v->arrayLength = arraySize;
     v->type = type;
     return UA_STATUSCODE_GOOD;
 }
@@ -686,16 +686,16 @@ static const UA_copySignature copyJumpTable[UA_BUILTIN_TYPES_COUNT + 1] = {
     (UA_copySignature)copyByte, // SByte
     (UA_copySignature)copyByte, // Byte
     (UA_copySignature)copy2Byte, // Int16
-    (UA_copySignature)copy2Byte, // UInt16 
-    (UA_copySignature)copy4Byte, // Int32 
-    (UA_copySignature)copy4Byte, // UInt32 
+    (UA_copySignature)copy2Byte, // UInt16
+    (UA_copySignature)copy4Byte, // Int32
+    (UA_copySignature)copy4Byte, // UInt32
     (UA_copySignature)copy8Byte, // Int64
-    (UA_copySignature)copy8Byte, // UInt64 
-    (UA_copySignature)copy4Byte, // Float 
-    (UA_copySignature)copy8Byte, // Double 
+    (UA_copySignature)copy8Byte, // UInt64
+    (UA_copySignature)copy4Byte, // Float
+    (UA_copySignature)copy8Byte, // Double
     (UA_copySignature)copyNoInit, // String
     (UA_copySignature)copy8Byte, // DateTime
-    (UA_copySignature)copyFixedSize, // Guid 
+    (UA_copySignature)copyFixedSize, // Guid
     (UA_copySignature)copyNoInit, // ByteString
     (UA_copySignature)copyNoInit, // XmlElement
     (UA_copySignature)NodeId_copy,
@@ -759,16 +759,16 @@ static const UA_deleteMembersSignature deleteMembersJumpTable[UA_BUILTIN_TYPES_C
     (UA_deleteMembersSignature)nopDeleteMembers, // SByte
     (UA_deleteMembersSignature)nopDeleteMembers, // Byte
     (UA_deleteMembersSignature)nopDeleteMembers, // Int16
-    (UA_deleteMembersSignature)nopDeleteMembers, // UInt16 
-    (UA_deleteMembersSignature)nopDeleteMembers, // Int32 
-    (UA_deleteMembersSignature)nopDeleteMembers, // UInt32 
+    (UA_deleteMembersSignature)nopDeleteMembers, // UInt16
+    (UA_deleteMembersSignature)nopDeleteMembers, // Int32
+    (UA_deleteMembersSignature)nopDeleteMembers, // UInt32
     (UA_deleteMembersSignature)nopDeleteMembers, // Int64
-    (UA_deleteMembersSignature)nopDeleteMembers, // UInt64 
-    (UA_deleteMembersSignature)nopDeleteMembers, // Float 
-    (UA_deleteMembersSignature)nopDeleteMembers, // Double 
+    (UA_deleteMembersSignature)nopDeleteMembers, // UInt64
+    (UA_deleteMembersSignature)nopDeleteMembers, // Float
+    (UA_deleteMembersSignature)nopDeleteMembers, // Double
     (UA_deleteMembersSignature)UA_deleteMembers, // String
     (UA_deleteMembersSignature)nopDeleteMembers, // DateTime
-    (UA_deleteMembersSignature)nopDeleteMembers, // Guid 
+    (UA_deleteMembersSignature)nopDeleteMembers, // Guid
     (UA_deleteMembersSignature)UA_deleteMembers, // ByteString
     (UA_deleteMembersSignature)UA_deleteMembers, // XmlElement
     (UA_deleteMembersSignature)NodeId_deleteMembers,
@@ -832,6 +832,9 @@ UA_Array_copy(const void *src, size_t src_size, void **dst, const UA_DataType *t
         return UA_STATUSCODE_GOOD;
     }
 
+    if(!type)
+        return UA_STATUSCODE_BADINTERNALERROR;
+
     /* calloc, so we don't have to check retval in every iteration of copying */
     *dst = UA_calloc(src_size, type->memSize);
     if(!*dst)