Sfoglia il codice sorgente

array dimensions are *signed* integers

Julius Pfrommer 9 anni fa
parent
commit
51def00929
4 ha cambiato i file con 16 aggiunte e 14 eliminazioni
  1. 1 1
      include/ua_types.h
  2. 9 5
      src/ua_types.c
  3. 2 2
      tests/check_builtin.c
  4. 4 6
      tests/check_services_attributes.c

+ 1 - 1
include/ua_types.h

@@ -538,7 +538,7 @@ typedef struct {
     size_t arrayLength;  // The number of elements in the data array
     void *data; // Points to the scalar or array data
     size_t arrayDimensionsSize; // The number of dimensions the data-array has
-    UA_UInt32 *arrayDimensions; // The length of each dimension of the data-array
+    UA_Int32 *arrayDimensions; // The length of each dimension of the data-array
 } UA_Variant;
 
 /* Returns true if the variant contains a scalar value. Note that empty variants contain

+ 9 - 5
src/ua_types.c

@@ -318,7 +318,7 @@ static void Variant_deletemembers(UA_Variant *p, const UA_DataType *_) {
         p->arrayLength = 0;
     }
     if(p->arrayDimensions) {
-        UA_Array_delete(p->arrayDimensions, p->arrayDimensionsSize, &UA_TYPES[UA_TYPES_UINT32]);
+        UA_Array_delete(p->arrayDimensions, p->arrayDimensionsSize, &UA_TYPES[UA_TYPES_INT32]);
         p->arrayDimensions = NULL;
         p->arrayDimensionsSize = 0;
     }
@@ -336,7 +336,7 @@ Variant_copy(UA_Variant const *src, UA_Variant *dst, const UA_DataType *_) {
     dst->type = src->type;
     if(src->arrayDimensions) {
         retval = UA_Array_copy(src->arrayDimensions, src->arrayDimensionsSize,
-            (void**)&dst->arrayDimensions, &UA_TYPES[UA_TYPES_UINT32]);
+            (void**)&dst->arrayDimensions, &UA_TYPES[UA_TYPES_INT32]);
         if(retval == UA_STATUSCODE_GOOD)
             dst->arrayDimensionsSize = src->arrayDimensionsSize;
         else
@@ -366,9 +366,13 @@ processRangeDefinition(const UA_Variant *v, const UA_NumericRange range, size_t
     const UA_UInt32 *dims = &arrayLength;
     if(v->arrayDimensionsSize > 0) {
         dims_count = v->arrayDimensionsSize;
-        dims = v->arrayDimensions;
-        for(size_t i = 0; i < dims_count; i++)
+        dims = (UA_UInt32*)v->arrayDimensions;
+        for(size_t i = 0; i < dims_count; i++) {
+            /* dimensions can have negative size similar to array lengths */
+            if(v->arrayDimensions[i] < 0)
+                return UA_STATUSCODE_BADINDEXRANGEINVALID;
             elements *= dims[i];
+        }
         if(elements != v->arrayLength)
             return UA_STATUSCODE_BADINTERNALERROR;
     }
@@ -457,7 +461,7 @@ UA_Variant_copyRange(const UA_Variant *src, UA_Variant *dst, const UA_NumericRan
         }
         dst->arrayDimensionsSize = src->arrayDimensionsSize;
         for(size_t k = 0; k < src->arrayDimensionsSize; k++)
-            dst->arrayDimensions[k] = range.dimensions[k].max - range.dimensions[k].min + 1;
+            dst->arrayDimensions[k] = (UA_Int32)(range.dimensions[k].max - range.dimensions[k].min + 1);
     }
     return UA_STATUSCODE_GOOD;
 }

+ 2 - 2
tests/check_builtin.c

@@ -1319,7 +1319,7 @@ START_TEST(UA_Variant_copyShallWorkOn1DArrayExample) {
     srcArray[1] = UA_STRING_ALLOC("_62541");
     srcArray[2] = UA_STRING_ALLOC("opc ua");
 
-    UA_UInt32 *dimensions;
+    UA_Int32 *dimensions;
     dimensions = UA_malloc(sizeof(UA_UInt32));
     dimensions[0] = 3;
 
@@ -1370,7 +1370,7 @@ START_TEST(UA_Variant_copyShallWorkOn2DArrayExample) {
     srcArray[4] = 4;
     srcArray[5] = 5;
 
-    UA_UInt32 *dimensions = UA_Array_new(2, &UA_TYPES[UA_TYPES_UINT32]);
+    UA_Int32 *dimensions = UA_Array_new(2, &UA_TYPES[UA_TYPES_INT32]);
     UA_Int32 dim1 = 3;
     UA_Int32 dim2 = 2;
     dimensions[0] = dim1;

+ 4 - 6
tests/check_services_attributes.c

@@ -15,11 +15,9 @@
 #include <urcu.h>
 #endif
 
-UA_StatusCode readCPUTemperature_broken(void *handle, const UA_NodeId nodeid, UA_Boolean sourceTimeStamp,
-                                        const UA_NumericRange *range, UA_DataValue *dataValue);
-UA_StatusCode readCPUTemperature_broken(void *handle, const UA_NodeId nodeid, UA_Boolean sourceTimeStamp,
-                                        const UA_NumericRange *range, UA_DataValue *dataValue) 
-{
+static UA_StatusCode
+readCPUTemperature_broken(void *handle, const UA_NodeId nodeid, UA_Boolean sourceTimeStamp,
+                          const UA_NumericRange *range, UA_DataValue *dataValue) {
   dataValue->hasValue = true;
   return UA_STATUSCODE_GOOD;
 }
@@ -69,7 +67,7 @@ static UA_Server* makeTestSequence(void) {
     UA_VariableAttributes_init(&vattr);
     UA_Int32 myIntegerArray[9] = {1,2,3,4,5,6,7,8,9};
     UA_Variant_setArray(&vattr.value, &myIntegerArray, 9, &UA_TYPES[UA_TYPES_INT32]);
-    UA_UInt32 myIntegerDimensions[2] = {3,3};
+    UA_Int32 myIntegerDimensions[2] = {3,3};
     vattr.value.arrayDimensions = myIntegerDimensions;
     vattr.value.arrayDimensionsSize = 2;
     vattr.displayName = UA_LOCALIZEDTEXT("locale","myarray");