FIX: json decoder bug jdec was crashing when string had spaces

This commit is contained in:
Christos Choutouridis 2022-02-06 23:41:39 +02:00
parent c84fd4a614
commit 795655edda

View File

@ -49,6 +49,8 @@ struct json_dec_t {
size_t pairs =0; size_t pairs =0;
char* begin = nullptr; char* begin = nullptr;
int s =0; int s =0;
bool str_value = false; // flag to indicate the value is string
for (size_t i=0 ; i<size ; ++i) { for (size_t i=0 ; i<size ; ++i) {
switch (state) { switch (state) {
case ST: case ST:
@ -99,26 +101,46 @@ struct json_dec_t {
valid_ = false; valid_ = false;
break; break;
} }
if (!begin && std::isspace(buffer[i])) if (!begin && std::isspace(buffer[i])) // consume pre-spaces
continue; continue;
else if (!begin && !std::isspace(buffer[i])) else if (!begin && !std::isspace(buffer[i])) { // first character
begin = (buffer[i] != '\"') ? (char*)&buffer[i] : (char*)&buffer[i+1]; if (buffer[i] == '\"') {
else if (begin && (std::isspace(buffer[i]) || buffer[i] == ',' || buffer[i] == '}')) { begin = (char*)&buffer[i+1];
s = (char*)&buffer[i] - begin; str_value = true;
s -= (buffer[i-1] == '\"') ? 1:0; }
if (s > 0) else {
pairs_[pairs].value = std::string_view{begin, (size_t)s}; begin = (char*)&buffer[i];
else str_value = false;
pairs_[pairs].value = std::string_view{}; }
++pairs; }
begin =nullptr; else if (begin) {
s =0; if (str_value && (buffer[i] == '\"')) {
if (std::isspace(buffer[i])) s = (char*)&buffer[i] - begin;
if (s > 0)
pairs_[pairs].value = std::string_view{begin, (size_t)s};
else
pairs_[pairs].value = std::string_view{};
++pairs;
begin =nullptr;
s =0;
state = SP; state = SP;
else if (buffer[i] == ',') }
state = KEY; else if (!str_value && (std::isspace(buffer[i]) || buffer[i] == ',' || buffer[i] == '}')) {
else if (buffer[i] == '}') s = (char*)&buffer[i] - begin;
return; if (s > 0)
pairs_[pairs].value = std::string_view{begin, (size_t)s};
else
pairs_[pairs].value = std::string_view{};
++pairs;
begin =nullptr;
s =0;
if (std::isspace(buffer[i]))
state = SP;
else if (buffer[i] == ',')
state = KEY;
else if (buffer[i] == '}')
return;
}
} }
break; break;