Skip to content

Commit b41049c

Browse files
authored
Merge pull request #743 from sodomelle/fix-format-xml-escaping
FilterX: fix escaping in format_xml and format_windows_eventlog_xml functions
2 parents e69ca1c + 2b1df32 commit b41049c

File tree

4 files changed

+28
-10
lines changed

4 files changed

+28
-10
lines changed

modules/xml/filterx-func-format-windows-eventlog-xml.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,11 @@ _append_inner_data_dict_element(FilterXObject *key, FilterXObject *value, gpoint
5454
}
5555

5656
if (value_str_len)
57-
g_string_append_printf(buffer, "<Data Name='%s'>%s</Data>", key_str, value_str);
57+
{
58+
gchar *escaped_value = g_markup_escape_text(value_str, value_str_len);
59+
g_string_append_printf(buffer, "<Data Name='%s'>%s</Data>", key_str, escaped_value);
60+
g_free(escaped_value);
61+
}
5862
else
5963
g_string_append_printf(buffer, "<Data Name='%s' />", key_str);
6064
return TRUE;
@@ -87,7 +91,9 @@ _append_data_element(FilterXObject *key, FilterXObject *value, gpointer user_dat
8791
return FALSE;
8892
}
8993

90-
self->append_leaf(key_str, value_str, value_str_len, buffer);
94+
gchar *escaped_value = g_markup_escape_text(value_str, value_str_len);
95+
self->append_leaf(key_str, escaped_value, strlen(escaped_value), buffer);
96+
g_free (escaped_value);
9197
return TRUE;
9298
}
9399

modules/xml/filterx-func-format-xml.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,23 +107,27 @@ append_list(FilterXObject *key, FilterXObject *list, gpointer user_data)
107107
}
108108

109109
static void
110-
_append_attribute(const char *key_str, const char *value_str, GString *buffer)
110+
_append_attribute(const char *key_str, GString *value_buffer, GString *buffer)
111111
{
112112
if (buffer->str[buffer->len - 1] == '>')
113113
g_string_overwrite(buffer, buffer->len - 1, " ");
114114
else
115115
g_string_append_c(buffer, ' ');
116116

117-
g_string_append_printf(buffer, "%s='%s'>", &key_str[1], value_str);
117+
gchar *escaped_value = g_markup_escape_text(value_buffer->str, value_buffer->len);
118+
g_string_append_printf(buffer, "%s='%s'>", &key_str[1], escaped_value);
119+
g_free(escaped_value);
118120
}
119121

120122
static void
121-
_append_text(const char *value_str, GString *buffer)
123+
_append_text(GString *value_buffer, GString *buffer)
122124
{
123125
if (buffer->str[buffer->len - 1] != '>')
124126
g_string_append_c(buffer, '>');
125127

126-
g_string_append(buffer, value_str);
128+
gchar *escaped_value = g_markup_escape_text(value_buffer->str, value_buffer->len);
129+
g_string_append(buffer, escaped_value);
130+
g_free(escaped_value);
127131
}
128132

129133
static void
@@ -158,17 +162,19 @@ _append_entry(FilterXObject *key, FilterXObject *value, gpointer user_data)
158162
if (key_str_len && (key_str[0] == '@'))
159163
{
160164
*is_only_attribute_present = TRUE;
161-
_append_attribute(key_str, val_buf->str, buffer);
165+
_append_attribute(key_str, val_buf, buffer);
162166
return TRUE;
163167
}
164168
if (key_str_len && (g_strcmp0(key_str, "#text") == 0))
165169
{
166170
*is_only_attribute_present = FALSE;
167-
_append_text(val_buf->str, buffer);
171+
_append_text(val_buf, buffer);
168172
return TRUE;
169173
}
170174

171-
self->append_leaf(key_str, val_buf->str, val_buf->len, buffer);
175+
gchar *escaped_value = g_markup_escape_text(val_buf->str, val_buf->len);
176+
self->append_leaf(key_str, escaped_value, strlen(escaped_value), buffer);
177+
g_free (escaped_value);
172178
return TRUE;
173179
}
174180

news/fx-bugfix-743.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
`xml`: Fix escaping in element values
2+
3+
Example:
4+
<b> -> &lt;b&gt;

tests/light/functional_tests/filterx/test_filterx.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2836,6 +2836,7 @@ def test_format_xml_valid_input(config, syslog_ng):
28362836
$MSG.float_leaf = format_xml({"a":100.0});
28372837
datetime = strptime("2000-01-01T00:00:00 +0200", "%Y-%m-%dT%H:%M:%S %z");
28382838
$MSG.datetime_leaf = format_xml({"a":datetime});
2839+
$MSG.escaped = format_xml({"a":"<b>"});
28392840
""",
28402841
)
28412842
syslog_ng.start(config)
@@ -2863,7 +2864,8 @@ def test_format_xml_valid_input(config, syslog_ng):
28632864
r""""multiple_root":"<a>b</a><a>c</a>","""
28642865
r""""integer_leaf":"<a>100</a>","""
28652866
r""""float_leaf":"<a>100.0</a>","""
2866-
r""""datetime_leaf":"<a>946677600.000000</a>"}"""
2867+
r""""datetime_leaf":"<a>946677600.000000</a>","""
2868+
r""""escaped":"<a>&lt;b&gt;</a>"}"""
28672869
)
28682870
assert file_true.read_log() == exp
28692871

0 commit comments

Comments
 (0)