From c5defe95b12e00dc0f307db4a010f03159f5aaa1 Mon Sep 17 00:00:00 2001 From: Michael Geramb Date: Wed, 19 Jun 2024 18:00:42 +0200 Subject: [PATCH] String \0 terminated in group objects --- src/knx/dptconvert.cpp | 8 +++----- src/knx/group_object.cpp | 16 +++++++++++++--- src/knx/group_object.h | 7 ++++++- src/knx/group_object_table_object.cpp | 4 ++-- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/knx/dptconvert.cpp b/src/knx/dptconvert.cpp index 1954d2d4..9f05fb2f 100644 --- a/src/knx/dptconvert.cpp +++ b/src/knx/dptconvert.cpp @@ -517,15 +517,13 @@ int busValueToAccess(const uint8_t* payload, size_t payload_length, const Dpt& d int busValueToString(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value) { ASSERT_PAYLOAD(14); - char strValue[15]; - strValue[14] = '\0'; for (int n = 0; n < 14; ++n) { - strValue[n] = signed8FromPayload(payload, n); - if (!datatype.subGroup && (strValue[n] & 0x80)) + auto value = signed8FromPayload(payload, n); + if (!datatype.subGroup && (value & 0x80)) return false; } - value = strValue; + value = (const char*) payload; return true; } diff --git a/src/knx/group_object.cpp b/src/knx/group_object.cpp index 5a9ad282..844fa18a 100644 --- a/src/knx/group_object.cpp +++ b/src/knx/group_object.cpp @@ -22,7 +22,7 @@ GroupObject::GroupObject() GroupObject::GroupObject(const GroupObject& other) { - _data = new uint8_t[other._dataLength]; + _data = new uint8_t[other._table != nullptr ? other.sizeInMemory() : other._dataLength]; _commFlagEx = other._commFlagEx; _dataLength = other._dataLength; _asap = other._asap; @@ -114,12 +114,12 @@ size_t GroupObject::goSize() size_t size = sizeInTelegram(); if (size == 0) return 1; - + return size; } // see knxspec 3.5.1 p. 178 -size_t GroupObject::asapValueSize(uint8_t code) +size_t GroupObject::asapValueSize(uint8_t code) const { if (code < 7) return 0; @@ -194,6 +194,16 @@ size_t GroupObject::sizeInTelegram() return asapValueSize(code); } +size_t GroupObject::sizeInMemory() const +{ + uint8_t code = lowByte(ntohs(_table->_tableData[_asap])); + size_t result = asapValueSize(code); + if (code == 0) + return 1; + if (code == 14) + return 14 + 1; +} + #ifdef SMALL_GROUPOBJECT GroupObjectUpdatedHandler GroupObject::classCallback() { diff --git a/src/knx/group_object.h b/src/knx/group_object.h index 02bd0c37..1644e142 100644 --- a/src/knx/group_object.h +++ b/src/knx/group_object.h @@ -139,6 +139,11 @@ class GroupObject * will return 0. */ size_t sizeInTelegram(); + /** + * returns the size of the group object in the heap memory of the group object. The function returns the same value as goSize(), + * exept fot the 14 byte string type to reserve one byte of a \0 terminator character. + */ + size_t sizeInMemory() const; /** * returns the pointer to the value of the group object. This can be used if a datapoint type is not supported or if you want do * your own conversion. @@ -274,7 +279,7 @@ class GroupObject static GroupObjectUpdatedHandler _updateHandlerStatic; #endif - size_t asapValueSize(uint8_t code); + size_t asapValueSize(uint8_t code) const; size_t goSize(); uint16_t _asap = 0; ComFlagEx _commFlagEx; diff --git a/src/knx/group_object_table_object.cpp b/src/knx/group_object_table_object.cpp index bdcf8ddd..3e227e94 100644 --- a/src/knx/group_object_table_object.cpp +++ b/src/knx/group_object_table_object.cpp @@ -107,9 +107,9 @@ bool GroupObjectTableObject::initGroupObjects() GroupObject& go = _groupObjects[asap - 1]; go._asap = asap; go._table = this; - + go._dataLength = go.goSize(); - go._data = new uint8_t[go._dataLength]; + go._data = new uint8_t[go.sizeInMemory()]; memset(go._data, 0, go._dataLength); if (go.valueReadOnInit())