summaryrefslogtreecommitdiff
path: root/libdm/libdm-report.c
diff options
context:
space:
mode:
authorPeter Rajnoha <prajnoha@redhat.com>2016-07-26 12:27:41 +0200
committerPeter Rajnoha <prajnoha@redhat.com>2016-07-26 12:27:41 +0200
commitf9697ea0067ef574aff09f1c8f25e1c7fab74c17 (patch)
tree4235f7cab59d262c52f87ea441e0e08fefaaf634 /libdm/libdm-report.c
parentd180bf63119580073235191c3527c9c8ee9cacbb (diff)
downloadlvm2-f9697ea0067ef574aff09f1c8f25e1c7fab74c17.tar.gz
libdm: report: fix json reporting to escape '"' character that may appear in reported string
Diffstat (limited to 'libdm/libdm-report.c')
-rw-r--r--libdm/libdm-report.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c
index 899320129..02fead573 100644
--- a/libdm/libdm-report.c
+++ b/libdm/libdm-report.c
@@ -4320,6 +4320,7 @@ static int _sort_rows(struct dm_report *rh)
#define JSON_OBJECT_END "}"
#define JSON_ARRAY_START "["
#define JSON_ARRAY_END "]"
+#define JSON_ESCAPE_CHAR "\\"
#define UNABLE_TO_EXTEND_OUTPUT_LINE_MSG "dm_report: Unable to extend output line"
@@ -4346,6 +4347,7 @@ static int _output_field(struct dm_report *rh, struct dm_report_field *field)
int32_t width;
uint32_t align;
const char *repstr;
+ const char *p1_repstr, *p2_repstr;
char *buf = NULL;
size_t buf_size = 0;
@@ -4393,9 +4395,33 @@ static int _output_field(struct dm_report *rh, struct dm_report_field *field)
repstr = field->report_string;
width = field->props->width;
if (!(rh->flags & DM_REPORT_OUTPUT_ALIGNED)) {
- if (!dm_pool_grow_object(rh->mem, repstr, 0)) {
- log_error(UNABLE_TO_EXTEND_OUTPUT_LINE_MSG);
- return 0;
+ if (_is_json_report(rh)) {
+ /* Escape any JSON_QUOTE that may appear in reported string. */
+ p1_repstr = repstr;
+ while ((p2_repstr = strstr(p1_repstr, JSON_QUOTE))) {
+ if (p2_repstr > p1_repstr) {
+ if (!dm_pool_grow_object(rh->mem, p1_repstr, p2_repstr - p1_repstr)) {
+ log_error(UNABLE_TO_EXTEND_OUTPUT_LINE_MSG);
+ return 0;
+ }
+ }
+ if (!dm_pool_grow_object(rh->mem, JSON_ESCAPE_CHAR, 1) ||
+ !dm_pool_grow_object(rh->mem, JSON_QUOTE, 1)) {
+ log_error(UNABLE_TO_EXTEND_OUTPUT_LINE_MSG);
+ return 0;
+ }
+ p1_repstr = p2_repstr + 1;
+ }
+
+ if (!dm_pool_grow_object(rh->mem, p1_repstr, 0)) {
+ log_error(UNABLE_TO_EXTEND_OUTPUT_LINE_MSG);
+ return 0;
+ }
+ } else {
+ if (!dm_pool_grow_object(rh->mem, repstr, 0)) {
+ log_error(UNABLE_TO_EXTEND_OUTPUT_LINE_MSG);
+ return 0;
+ }
}
} else {
if (!(align = field->props->flags & DM_REPORT_FIELD_ALIGN_MASK))