String \0 terminated in group objects (#25)

* String \0 terminated in group objects

* Remove copy constructor, fix bugs in setting buffer to 0

* Remove copy constructor in GroupObject
This commit is contained in:
Michael Geramb 2024-07-20 16:27:47 +02:00 committed by GitHub
parent 12fb67cc63
commit 093ae425b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 26 additions and 27 deletions

View File

@ -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) int busValueToString(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value)
{ {
ASSERT_PAYLOAD(14); ASSERT_PAYLOAD(14);
char strValue[15];
strValue[14] = '\0';
for (int n = 0; n < 14; ++n) for (int n = 0; n < 14; ++n)
{ {
strValue[n] = signed8FromPayload(payload, n); auto value = signed8FromPayload(payload, n);
if (!datatype.subGroup && (strValue[n] & 0x80)) if (!datatype.subGroup && (value & 0x80))
return false; return false;
} }
value = strValue; value = (const char*) payload;
return true; return true;
} }

View File

@ -20,18 +20,6 @@ GroupObject::GroupObject()
#endif #endif
} }
GroupObject::GroupObject(const GroupObject& other)
{
_data = new uint8_t[other._dataLength];
_commFlagEx = other._commFlagEx;
_dataLength = other._dataLength;
_asap = other._asap;
#ifndef SMALL_GROUPOBJECT
_updateHandler = other._updateHandler;
#endif
memcpy(_data, other._data, _dataLength);
}
GroupObject::~GroupObject() GroupObject::~GroupObject()
{ {
if (_data) if (_data)
@ -114,12 +102,12 @@ size_t GroupObject::goSize()
size_t size = sizeInTelegram(); size_t size = sizeInTelegram();
if (size == 0) if (size == 0)
return 1; return 1;
return size; return size;
} }
// see knxspec 3.5.1 p. 178 // 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) if (code < 7)
return 0; return 0;
@ -194,6 +182,17 @@ size_t GroupObject::sizeInTelegram()
return asapValueSize(code); 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;
return result;
}
#ifdef SMALL_GROUPOBJECT #ifdef SMALL_GROUPOBJECT
GroupObjectUpdatedHandler GroupObject::classCallback() GroupObjectUpdatedHandler GroupObject::classCallback()
{ {

View File

@ -57,10 +57,6 @@ class GroupObject
* The constructor. * The constructor.
*/ */
GroupObject(); GroupObject();
/**
* The copy constructor.
*/
GroupObject(const GroupObject& other);
/** /**
* The destructor. * The destructor.
*/ */
@ -139,6 +135,11 @@ class GroupObject
* will return 0. * will return 0.
*/ */
size_t sizeInTelegram(); 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 * 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. * your own conversion.
@ -274,7 +275,7 @@ class GroupObject
static GroupObjectUpdatedHandler _updateHandlerStatic; static GroupObjectUpdatedHandler _updateHandlerStatic;
#endif #endif
size_t asapValueSize(uint8_t code); size_t asapValueSize(uint8_t code) const;
size_t goSize(); size_t goSize();
uint16_t _asap = 0; uint16_t _asap = 0;
ComFlagEx _commFlagEx; ComFlagEx _commFlagEx;

View File

@ -107,10 +107,11 @@ bool GroupObjectTableObject::initGroupObjects()
GroupObject& go = _groupObjects[asap - 1]; GroupObject& go = _groupObjects[asap - 1];
go._asap = asap; go._asap = asap;
go._table = this; go._table = this;
go._dataLength = go.goSize(); go._dataLength = go.goSize();
go._data = new uint8_t[go._dataLength]; size_t sizeInMemory = go.sizeInMemory();
memset(go._data, 0, go._dataLength); go._data = new uint8_t[sizeInMemory];
memset(go._data, 0, sizeInMemory);
if (go.valueReadOnInit()) if (go.valueReadOnInit())
go.requestObjectRead(); go.requestObjectRead();