Append terminator in saveStringFromFreeZone()

This commit is contained in:
Benoit Blanchon
2021-11-20 20:29:09 +01:00
parent 62f9b94ab1
commit 43b2e2e774
10 changed files with 58 additions and 25 deletions

View File

@ -401,8 +401,6 @@ class JsonDeserializer {
_stringStorage.append(c);
}
_stringStorage.append('\0');
if (!_stringStorage.isValid()) {
_error = DeserializationError::NoMemory;
return false;
@ -426,8 +424,6 @@ class JsonDeserializer {
return false;
}
_stringStorage.append('\0');
if (!_stringStorage.isValid()) {
_error = DeserializationError::NoMemory;
return false;

View File

@ -87,13 +87,14 @@ class MemoryPool {
const char* saveStringFromFreeZone(size_t len) {
#if ARDUINOJSON_ENABLE_STRING_DEDUPLICATION
const char* dup = findString(adaptString(_left));
const char* dup = findString(adaptString(_left, len));
if (dup)
return dup;
#endif
const char* str = _left;
_left += len;
*_left++ = 0;
checkInvariants();
return str;
}

View File

@ -343,7 +343,6 @@ class MsgPackDeserializer {
return false;
_stringStorage.append(static_cast<char>(c));
}
_stringStorage.append('\0');
if (!_stringStorage.isValid()) {
_error = DeserializationError::NoMemory;
return false;

View File

@ -17,10 +17,13 @@ class StringCopier {
void startString() {
_pool->getFreeZone(&_ptr, &_capacity);
_size = 0;
if (_capacity == 0)
_pool->markAsOverflowed();
}
string_type save() {
ARDUINOJSON_ASSERT(_ptr);
ARDUINOJSON_ASSERT(_size < _capacity); // needs room for the terminator
return _pool->saveStringFromFreeZone(_size);
}
@ -33,23 +36,24 @@ class StringCopier {
}
void append(char c) {
if (!_ptr)
return;
if (_size >= _capacity) {
_ptr = 0;
if (_size + 1 < _capacity)
_ptr[_size++] = c;
else
_pool->markAsOverflowed();
return;
}
_ptr[_size++] = c;
}
bool isValid() {
return _ptr != 0;
bool isValid() const {
return !_pool->overflowed();
}
size_t size() const {
return _size;
}
string_type str() const {
ARDUINOJSON_ASSERT(_ptr);
ARDUINOJSON_ASSERT(_size < _capacity);
_ptr[_size] = 0;
return _ptr;
}

View File

@ -20,7 +20,10 @@ class StringMover {
}
FORCE_INLINE string_type save() {
return _startPtr;
_writePtr[0] = 0; // terminator
string_type s = str();
_writePtr++;
return s;
}
void append(char c) {
@ -35,6 +38,10 @@ class StringMover {
return string_type(_startPtr);
}
size_t size() const {
return size_t(_writePtr - _startPtr);
}
private:
char* _writePtr;
char* _startPtr;

View File

@ -204,8 +204,7 @@ class MemoryPoolPrint : public Print {
}
CopiedString str() {
_string[_size++] = 0;
ARDUINOJSON_ASSERT(_size <= _capacity);
ARDUINOJSON_ASSERT(_size < _capacity);
return _pool->saveStringFromFreeZone(_size);
}