Skip to content

Commit 0b23e5f

Browse files
mregenmarcschier
andauthored
Null pointer exception when reading a complex type with empty arrays. (#2798) (#2799)
The server under test has a extension object with a complex type. Type id = {nsu=http://opcfoundation.org/UA/Machinery/Result/;i=5008}. This contains something with a variant array that is null though (-1). SetProperty should support setting a Array that is null. Therefore, test for null collection (case when length was encoded as -1) before dereferencing ahead of the ToArrray() conversion to Array. Co-authored-by: Marc Schier <marcschier@users.noreply.github.com>
1 parent 6ca0b1a commit 0b23e5f

File tree

1 file changed

+26
-26
lines changed

1 file changed

+26
-26
lines changed

Stack/Opc.Ua.Core/Types/Encoders/BinaryDecoder.cs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,15 +1386,15 @@ public Array ReadArray(
13861386
switch (builtInType)
13871387
{
13881388
case BuiltInType.Boolean:
1389-
return ReadBooleanArray(fieldName).ToArray();
1389+
return ReadBooleanArray(fieldName)?.ToArray();
13901390
case BuiltInType.SByte:
1391-
return ReadSByteArray(fieldName).ToArray();
1391+
return ReadSByteArray(fieldName)?.ToArray();
13921392
case BuiltInType.Byte:
1393-
return ReadByteArray(fieldName).ToArray();
1393+
return ReadByteArray(fieldName)?.ToArray();
13941394
case BuiltInType.Int16:
1395-
return ReadInt16Array(fieldName).ToArray();
1395+
return ReadInt16Array(fieldName)?.ToArray();
13961396
case BuiltInType.UInt16:
1397-
return ReadUInt16Array(fieldName).ToArray();
1397+
return ReadUInt16Array(fieldName)?.ToArray();
13981398
case BuiltInType.Enumeration:
13991399
{
14001400
DetermineIEncodeableSystemType(ref systemType, encodeableTypeId);
@@ -1406,51 +1406,51 @@ public Array ReadArray(
14061406
goto case BuiltInType.Int32;
14071407
}
14081408
case BuiltInType.Int32:
1409-
return ReadInt32Array(fieldName).ToArray();
1409+
return ReadInt32Array(fieldName)?.ToArray();
14101410
case BuiltInType.UInt32:
1411-
return ReadUInt32Array(fieldName).ToArray();
1411+
return ReadUInt32Array(fieldName)?.ToArray();
14121412
case BuiltInType.Int64:
1413-
return ReadInt64Array(fieldName).ToArray();
1413+
return ReadInt64Array(fieldName)?.ToArray();
14141414
case BuiltInType.UInt64:
1415-
return ReadUInt64Array(fieldName).ToArray();
1415+
return ReadUInt64Array(fieldName)?.ToArray();
14161416
case BuiltInType.Float:
1417-
return ReadFloatArray(fieldName).ToArray();
1417+
return ReadFloatArray(fieldName)?.ToArray();
14181418
case BuiltInType.Double:
1419-
return ReadDoubleArray(fieldName).ToArray();
1419+
return ReadDoubleArray(fieldName)?.ToArray();
14201420
case BuiltInType.String:
1421-
return ReadStringArray(fieldName).ToArray();
1421+
return ReadStringArray(fieldName)?.ToArray();
14221422
case BuiltInType.DateTime:
1423-
return ReadDateTimeArray(fieldName).ToArray();
1423+
return ReadDateTimeArray(fieldName)?.ToArray();
14241424
case BuiltInType.Guid:
1425-
return ReadGuidArray(fieldName).ToArray();
1425+
return ReadGuidArray(fieldName)?.ToArray();
14261426
case BuiltInType.ByteString:
1427-
return ReadByteStringArray(fieldName).ToArray();
1427+
return ReadByteStringArray(fieldName)?.ToArray();
14281428
case BuiltInType.XmlElement:
1429-
return ReadXmlElementArray(fieldName).ToArray();
1429+
return ReadXmlElementArray(fieldName)?.ToArray();
14301430
case BuiltInType.NodeId:
1431-
return ReadNodeIdArray(fieldName).ToArray();
1431+
return ReadNodeIdArray(fieldName)?.ToArray();
14321432
case BuiltInType.ExpandedNodeId:
1433-
return ReadExpandedNodeIdArray(fieldName).ToArray();
1433+
return ReadExpandedNodeIdArray(fieldName)?.ToArray();
14341434
case BuiltInType.StatusCode:
1435-
return ReadStatusCodeArray(fieldName).ToArray();
1435+
return ReadStatusCodeArray(fieldName)?.ToArray();
14361436
case BuiltInType.QualifiedName:
1437-
return ReadQualifiedNameArray(fieldName).ToArray();
1437+
return ReadQualifiedNameArray(fieldName)?.ToArray();
14381438
case BuiltInType.LocalizedText:
1439-
return ReadLocalizedTextArray(fieldName).ToArray();
1439+
return ReadLocalizedTextArray(fieldName)?.ToArray();
14401440
case BuiltInType.DataValue:
1441-
return ReadDataValueArray(fieldName).ToArray();
1441+
return ReadDataValueArray(fieldName)?.ToArray();
14421442
case BuiltInType.Variant:
14431443
{
14441444
if (DetermineIEncodeableSystemType(ref systemType, encodeableTypeId))
14451445
{
14461446
return ReadEncodeableArray(fieldName, systemType, encodeableTypeId);
14471447
}
1448-
return ReadVariantArray(fieldName).ToArray();
1448+
return ReadVariantArray(fieldName)?.ToArray();
14491449
}
14501450
case BuiltInType.ExtensionObject:
1451-
return ReadExtensionObjectArray(fieldName).ToArray();
1451+
return ReadExtensionObjectArray(fieldName)?.ToArray();
14521452
case BuiltInType.DiagnosticInfo:
1453-
return ReadDiagnosticInfoArray(fieldName).ToArray();
1453+
return ReadDiagnosticInfoArray(fieldName)?.ToArray();
14541454
default:
14551455
{
14561456
if (DetermineIEncodeableSystemType(ref systemType, encodeableTypeId))
@@ -1604,7 +1604,7 @@ private bool DetermineIEncodeableSystemType(ref Type systemType, ExpandedNodeId
16041604
}
16051605

16061606
/// <summary>
1607-
/// Reads and returns an array of elements of the specified length and builtInType
1607+
/// Reads and returns an array of elements of the specified length and builtInType
16081608
/// </summary>
16091609
private Array ReadArrayElements(int length, BuiltInType builtInType)
16101610
{

0 commit comments

Comments
 (0)