fix(datastore): correctly handle null terminated strings

This commit is contained in:
fallenoak 2023-02-10 14:53:11 -06:00
parent d1e4812aa3
commit 156ccfdb7d
No known key found for this signature in database
GPG key ID: 7628F8E61AEA070D
2 changed files with 21 additions and 3 deletions

View file

@ -159,6 +159,10 @@ CDataStore& CDataStore::GetString(char* val, uint32_t maxChars) {
STORM_ASSERT(this->IsFinal());
STORM_ASSERT(val || maxChars == 0);
if (maxChars == 0) {
return *this;
}
if (this->FetchRead(this->m_read, 1)) {
auto ofs = this->m_read - this->m_base;
auto ptr = &this->m_data[ofs];
@ -168,7 +172,7 @@ CDataStore& CDataStore::GetString(char* val, uint32_t maxChars) {
val[i] = *reinterpret_cast<char*>(&ptr[i]);
}
this->m_read += i;
this->m_read += i == maxChars ? i : i + 1;
}
return *this;
@ -316,7 +320,7 @@ CDataStore& CDataStore::PutData(const void* val, uint32_t bytes) {
CDataStore& CDataStore::PutString(const char* val) {
auto len = SStrLen(val);
return this->PutArray(reinterpret_cast<const uint8_t*>(val), len);
return this->PutArray(reinterpret_cast<const uint8_t*>(val), len + 1);
}
void CDataStore::Reset() {

View file

@ -80,9 +80,10 @@ TEST_CASE("CDataStore::Get", "[datastore]") {
msg.GetString(readVal, sizeof(readVal));
REQUIRE(SStrCmp(readVal, writeVal, STORM_MAX_STR) == 0);
REQUIRE(msg.IsRead());
}
SECTION("gets string honoring maxchars") {
SECTION("gets string honoring maxchars > 0") {
const char* writeVal = "foobar";
char readVal[7] = "bar";
@ -92,5 +93,18 @@ TEST_CASE("CDataStore::Get", "[datastore]") {
msg.GetString(readVal, 3);
REQUIRE(SStrCmp(readVal, "foo", STORM_MAX_STR) == 0);
REQUIRE(msg.m_read == 3);
}
SECTION("gets string honoring maxchars of 0") {
const char* writeVal = "foobar";
char readVal[7] = "bar";
CDataStore msg;
msg.PutString(writeVal);
msg.Finalize();
msg.GetString(readVal, 0);
REQUIRE(msg.m_read == 0);
}
}