From 8e5933738cbab75ea1cf6d39a70bc54b281c818b Mon Sep 17 00:00:00 2001 From: Chris Breneman Date: Fri, 7 Feb 2020 15:06:24 -0500 Subject: [PATCH 1/3] Ensure json_serialize generates valid json when handling empty objects --- g2core/json_parser.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/g2core/json_parser.cpp b/g2core/json_parser.cpp index d1473351..5445f6e6 100644 --- a/g2core/json_parser.cpp +++ b/g2core/json_parser.cpp @@ -400,8 +400,6 @@ static stat_t _get_nv_pair(nvObj_t *nv, char **pstr, int8_t *depth) * - Allow self-referential elements that would otherwise cause a recursive loop * - Skip over empty objects (TYPE_EMPTY) * - If a JSON object is empty represent it as {} - * --- OR --- - * - If a JSON object is empty omit the object altogether (no curlies) */ uint16_t json_serialize(nvObj_t *nv, char *out_buf, uint16_t size) @@ -430,6 +428,7 @@ uint16_t json_serialize(nvObj_t *nv, char *out_buf, uint16_t size) } case (TYPE_PARENT): { *str++ = '{'; need_a_comma = false; + prev_depth++; // make sure empty objects are closed break; } case (TYPE_FLOAT): { convert_outgoing_float(nv); From 04477dbb8c33d0a3b23c37f0292078be79673622 Mon Sep 17 00:00:00 2001 From: Chris Breneman Date: Fri, 7 Feb 2020 15:53:33 -0500 Subject: [PATCH 2/3] Make double-buffered status reports work as intended (previously was nulling out sr list on sr set) --- g2core/report.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/g2core/report.cpp b/g2core/report.cpp index 4a35ddde..faf180cd 100644 --- a/g2core/report.cpp +++ b/g2core/report.cpp @@ -253,21 +253,21 @@ stat_t sr_set_status_report(nvObj_t *nv) if (nv->value_int) { auto &cfgTmp = cfgArray[nv->value_int]; - sr.status_report_list[i].index = nv->index; - sr.status_report_list[i].get = cfgTmp.get; - // sr.status_report_list[i].flags = cfgTmp.flags; - sr.status_report_list[i].precision = cfgTmp.precision; - strcpy(sr.status_report_list[i].group, cfgTmp.group); - strcpy(sr.status_report_list[i].token, cfgTmp.token); + status_report_list[i].index = nv->index; + status_report_list[i].get = cfgTmp.get; + // status_report_list[i].flags = cfgTmp.flags; + status_report_list[i].precision = cfgTmp.precision; + strcpy(status_report_list[i].group, cfgTmp.group); + strcpy(status_report_list[i].token, cfgTmp.token); // special processing for system groups and stripping tokens for groups if (cfgTmp.group[0] != NUL) { if (cfgArray[nv->index].flags & F_NOSTRIP) { - sr.status_report_list[i].group[0] = NUL; - strcpy(sr.status_report_list[i].token, cfgTmp.token); + status_report_list[i].group[0] = NUL; + strcpy(status_report_list[i].token, cfgTmp.token); } else { - strcpy(sr.status_report_list[i].group, cfgTmp.group); - strcpy(sr.status_report_list[i].token, &cfgTmp.token[strlen(cfgTmp.group)]); // strip group from the token + strcpy(status_report_list[i].group, cfgTmp.group); + strcpy(status_report_list[i].token, &cfgTmp.token[strlen(cfgTmp.group)]); // strip group from the token } } nv->value_int = nv->index; // persist the index as the value From 9cca1b1de9921d2b8262e534f0462bd0cea36e83 Mon Sep 17 00:00:00 2001 From: Chris Breneman Date: Fri, 7 Feb 2020 16:05:13 -0500 Subject: [PATCH 3/3] Make sr_set_status_report use correct cfgArray index --- g2core/report.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/g2core/report.cpp b/g2core/report.cpp index faf180cd..c5259d4c 100644 --- a/g2core/report.cpp +++ b/g2core/report.cpp @@ -251,7 +251,7 @@ stat_t sr_set_status_report(nvObj_t *nv) } // Note: valuetype may have been coerced from boolean to something else, so just treat value_int as a bool if (nv->value_int) { - auto &cfgTmp = cfgArray[nv->value_int]; + auto &cfgTmp = cfgArray[nv->index]; status_report_list[i].index = nv->index; status_report_list[i].get = cfgTmp.get;