You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2024/09/13 10:17:30 UTC

(plc4x) 03/03: feat(bacnetip): avoid panic on garbage data

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 46fa163f9defb989f39bd7602d9c6e586dd10bb7
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Sep 13 12:17:20 2024 +0200

    feat(bacnetip): avoid panic on garbage data
---
 plc4go/protocols/bacnetip/readwrite/model/NPDU.go                    | 5 +++++
 .../bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec    | 1 +
 2 files changed, 6 insertions(+)

diff --git a/plc4go/protocols/bacnetip/readwrite/model/NPDU.go b/plc4go/protocols/bacnetip/readwrite/model/NPDU.go
index a47d89252d..a6003ceec3 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/NPDU.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/NPDU.go
@@ -342,6 +342,11 @@ func (m *_NPDU) parse(ctx context.Context, readBuffer utils.ReadBuffer, npduLeng
 	}
 	m.Control = control
 
+	// Validation
+	if !(bool((control) != (nil))) {
+		return nil, errors.WithStack(utils.ParseValidationError{Message: "control required for further processing"})
+	}
+
 	var destinationNetworkAddress *uint16
 	destinationNetworkAddress, err = ReadOptionalField[uint16](ctx, "destinationNetworkAddress", ReadUnsignedShort(readBuffer, uint8(16)), control.GetDestinationSpecified())
 	if err != nil {
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index 8cee11b75a..848b6ec0cf 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -98,6 +98,7 @@
 [type NPDU(uint 16 npduLength)
     [simple   uint 8      protocolVersionNumber                                                                   ]
     [simple   NPDUControl control                                                                                 ]
+    [validation    'control != null'    "control required for further processing"                                 ]
     [optional uint 16     destinationNetworkAddress   'control.destinationSpecified'                              ]
     [optional uint 8      destinationLength           'control.destinationSpecified'                              ]
     [array    uint 8      destinationAddress count    'control.destinationSpecified ? destinationLength : 0'      ]