Parcourir la source

variants with a zero encodingbyte are empty

Julius Pfrommer il y a 8 ans
Parent
commit
6d65901096
1 fichiers modifiés avec 9 ajouts et 6 suppressions
  1. 9 6
      src/ua_types_encoding_binary.c

+ 9 - 6
src/ua_types_encoding_binary.c

@@ -804,14 +804,15 @@ enum UA_VARIANT_ENCODINGMASKTYPE {
 
 static UA_StatusCode
 Variant_encodeBinary(UA_Variant const *src, const UA_DataType *_, bufpos pos, bufend end) {
+    UA_Byte encodingByte = 0;
     if(!src->type)
-        return UA_STATUSCODE_BADINTERNALERROR;
+        return Byte_encodeBinary(&encodingByte, NULL, pos, end); /* empty variant */
+
     const UA_Boolean isArray = src->arrayLength > 0 || src->data <= UA_EMPTY_ARRAY_SENTINEL;
     const UA_Boolean hasDimensions = isArray && src->arrayDimensionsSize > 0;
     const UA_Boolean isBuiltin = src->type->builtin;
 
     /* Encode the encodingbyte */
-    UA_Byte encodingByte = 0;
     if(isArray) {
         encodingByte |= UA_VARIANT_ENCODINGMASKTYPE_ARRAY;
         if(hasDimensions)
@@ -819,7 +820,7 @@ Variant_encodeBinary(UA_Variant const *src, const UA_DataType *_, bufpos pos, bu
     }
     if(isBuiltin) {
         UA_Byte t = (UA_Byte) (UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (src->type->typeIndex + 1));
-	encodingByte |= t;
+        encodingByte |= t;
     } else
         encodingByte |= UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (UA_Byte) 22; /* ExtensionObject */
     UA_StatusCode retval = Byte_encodeBinary(&encodingByte, NULL, pos, end);
@@ -878,6 +879,8 @@ Variant_decodeBinary(bufpos pos, bufend end, UA_Variant *dst, const UA_DataType
     UA_StatusCode retval = Byte_decodeBinary(pos, end, &encodingByte, NULL);
     if(retval != UA_STATUSCODE_GOOD)
         return retval;
+    if(encodingByte == 0)
+        return UA_STATUSCODE_GOOD; /* empty Variant (was already _inited) */
     UA_Boolean isArray = encodingByte & UA_VARIANT_ENCODINGMASKTYPE_ARRAY;
     size_t typeIndex = (size_t)((encodingByte & UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK) - 1);
     if(typeIndex > 24) /* the type must be builtin (maybe wrapped in an extensionobject) */
@@ -1339,10 +1342,10 @@ ExtensionObject_calcSizeBinary(const UA_ExtensionObject *src, UA_DataType *_) {
 
 static size_t
 Variant_calcSizeBinary(UA_Variant const *src, UA_DataType *_) {
-    size_t s = 1; // encoding byte
-
+    size_t s = 1; /* encoding byte */
     if(!src->type)
-        return 0;
+        return s;
+
     UA_Boolean isArray = src->arrayLength > 0 || src->data <= UA_EMPTY_ARRAY_SENTINEL;
     UA_Boolean hasDimensions = isArray && src->arrayDimensionsSize > 0;
     UA_Boolean isBuiltin = src->type->builtin;