|
@@ -943,7 +943,7 @@ ExtensionObject_decodeBinaryContent(UA_ExtensionObject *dst, const UA_NodeId *ty
|
|
|
|
|
|
if(!type) {
|
|
|
dst->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING;
|
|
|
- dst->content.encoded.typeId = *typeId;
|
|
|
+ UA_NodeId_copy(typeId, &dst->content.encoded.typeId);
|
|
|
return ByteString_decodeBinary(&dst->content.encoded.body);
|
|
|
}
|
|
|
|
|
@@ -1145,9 +1145,11 @@ Variant_decodeBinary(UA_Variant *dst, const UA_DataType *_) {
|
|
|
const bool isArray = (encodingByte & UA_VARIANT_ENCODINGMASKTYPE_ARRAY) > 0;
|
|
|
|
|
|
|
|
|
- * All not-builtin types are wrapped in an ExtensionObject. */
|
|
|
+ * All not-builtin types are wrapped in an ExtensionObject.
|
|
|
+ * The content can not be a variant again, otherwise we may run into a stack overflow problem.
|
|
|
+ * See: https:
|
|
|
size_t typeIndex = (size_t)((encodingByte & UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK) - 1);
|
|
|
- if(typeIndex > UA_TYPES_DIAGNOSTICINFO)
|
|
|
+ if(typeIndex > UA_TYPES_DIAGNOSTICINFO || typeIndex == UA_TYPES_VARIANT)
|
|
|
return UA_STATUSCODE_BADDECODINGERROR;
|
|
|
dst->type = &UA_TYPES[typeIndex];
|
|
|
|