1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

libdm: report: fix escaping of JSON quote char in reported fields

Commit 73ec3c954b added a way to print
only a part of the report string (repstr) to support decoding individual
string list items out of repstr.

The repstr is normally printed through _safe_repstr_output so that any
JSON_QUOTE character ('"') found within the repstr is escaped to not
interfere with value quoting in JSON format.

However, the commit 73ec3c954b missed
checking the 'len' argument passed to _safe_repstr_output function when
adding the rest of the repstr after all previous JSON_QUOTE characters
were escaped (when calling the last dm_pool_grow_object). When 'len'
is 0, we need to calculate the 'len' ourselves in the function by
simply calling strlen. This is because 'len' is passed to the function
only if we're taking a part of repstr, not as a whole.
This commit is contained in:
Peter Rajnoha 2022-08-24 12:08:51 +02:00
parent 508782a913
commit 800436d2af
2 changed files with 6 additions and 16 deletions

View File

@ -4572,17 +4572,12 @@ bad:
static int _safe_repstr_output(struct dm_report *rh, const char *repstr, size_t len) static int _safe_repstr_output(struct dm_report *rh, const char *repstr, size_t len)
{ {
const char *p_repstr; const char *p_repstr;
const char *repstr_end = repstr + len; const char *repstr_end = len ? repstr + len : repstr + strlen(repstr);
/* Escape any JSON_QUOTE that may appear in reported string. */ /* Escape any JSON_QUOTE that may appear in reported string. */
while (1) { while (1) {
if (len) { if (!(p_repstr = memchr(repstr, JSON_QUOTE[0], repstr_end - repstr)))
if (!(p_repstr = memchr(repstr, JSON_QUOTE[0], repstr_end - repstr))) break;
break;
} else {
if (!(p_repstr = strstr(repstr, JSON_QUOTE)))
break;
}
if (p_repstr > repstr) { if (p_repstr > repstr) {
if (!dm_pool_grow_object(rh->mem, repstr, p_repstr - repstr)) { if (!dm_pool_grow_object(rh->mem, repstr, p_repstr - repstr)) {

View File

@ -4571,17 +4571,12 @@ bad:
static int _safe_repstr_output(struct dm_report *rh, const char *repstr, size_t len) static int _safe_repstr_output(struct dm_report *rh, const char *repstr, size_t len)
{ {
const char *p_repstr; const char *p_repstr;
const char *repstr_end = repstr + len; const char *repstr_end = len ? repstr + len : repstr + strlen(repstr);
/* Escape any JSON_QUOTE that may appear in reported string. */ /* Escape any JSON_QUOTE that may appear in reported string. */
while (1) { while (1) {
if (len) { if (!(p_repstr = memchr(repstr, JSON_QUOTE[0], repstr_end - repstr)))
if (!(p_repstr = memchr(repstr, JSON_QUOTE[0], repstr_end - repstr))) break;
break;
} else {
if (!(p_repstr = strstr(repstr, JSON_QUOTE)))
break;
}
if (p_repstr > repstr) { if (p_repstr > repstr) {
if (!dm_pool_grow_object(rh->mem, repstr, p_repstr - repstr)) { if (!dm_pool_grow_object(rh->mem, repstr, p_repstr - repstr)) {