aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libucl
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-02-08 13:32:30 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2017-02-08 13:46:57 +0000
commit60a221d3e43e1bf2d03b8fd1faec9b3ad78672dc (patch)
treecda2d160728396b0d391ba0112ac621e34d32a16 /contrib/libucl
parent2f5cc0b94fb8957d9e01390326a06f5bbda15d9a (diff)
downloadrspamd-60a221d3e43e1bf2d03b8fd1faec9b3ad78672dc.tar.gz
rspamd-60a221d3e43e1bf2d03b8fd1faec9b3ad78672dc.zip
[Fix] Strictly filter bad characters when emittin json
Diffstat (limited to 'contrib/libucl')
-rw-r--r--contrib/libucl/ucl_emitter_utils.c8
-rw-r--r--contrib/libucl/ucl_internal.h26
2 files changed, 20 insertions, 14 deletions
diff --git a/contrib/libucl/ucl_emitter_utils.c b/contrib/libucl/ucl_emitter_utils.c
index 95ac9a5d5..3559eb63d 100644
--- a/contrib/libucl/ucl_emitter_utils.c
+++ b/contrib/libucl/ucl_emitter_utils.c
@@ -102,7 +102,7 @@ ucl_elt_string_write_json (const char *str, size_t size,
func->ucl_emitter_append_character ('"', 1, func->ud);
while (size) {
- if (ucl_test_character (*p, UCL_CHARACTER_JSON_UNSAFE)) {
+ if (ucl_test_character (*p, UCL_CHARACTER_JSON_UNSAFE|UCL_CHARACTER_DENIED)) {
if (len > 0) {
func->ucl_emitter_append_len (c, len, func->ud);
}
@@ -128,6 +128,10 @@ ucl_elt_string_write_json (const char *str, size_t size,
case '"':
func->ucl_emitter_append_len ("\\\"", 2, func->ud);
break;
+ default:
+ /* Emit unicode unknown character */
+ func->ucl_emitter_append_len ("\\uFFFD", 5, func->ud);
+ break;
}
len = 0;
c = ++p;
@@ -138,9 +142,11 @@ ucl_elt_string_write_json (const char *str, size_t size,
}
size --;
}
+
if (len > 0) {
func->ucl_emitter_append_len (c, len, func->ud);
}
+
func->ucl_emitter_append_character ('"', 1, func->ud);
}
diff --git a/contrib/libucl/ucl_internal.h b/contrib/libucl/ucl_internal.h
index 444a40e38..44a8fe70e 100644
--- a/contrib/libucl/ucl_internal.h
+++ b/contrib/libucl/ucl_internal.h
@@ -128,19 +128,19 @@ enum ucl_parser_state {
};
enum ucl_character_type {
- UCL_CHARACTER_DENIED = 0,
- UCL_CHARACTER_KEY = 1,
- UCL_CHARACTER_KEY_START = 1 << 1,
- UCL_CHARACTER_WHITESPACE = 1 << 2,
- UCL_CHARACTER_WHITESPACE_UNSAFE = 1 << 3,
- UCL_CHARACTER_VALUE_END = 1 << 4,
- UCL_CHARACTER_VALUE_STR = 1 << 5,
- UCL_CHARACTER_VALUE_DIGIT = 1 << 6,
- UCL_CHARACTER_VALUE_DIGIT_START = 1 << 7,
- UCL_CHARACTER_ESCAPE = 1 << 8,
- UCL_CHARACTER_KEY_SEP = 1 << 9,
- UCL_CHARACTER_JSON_UNSAFE = 1 << 10,
- UCL_CHARACTER_UCL_UNSAFE = 1 << 11
+ UCL_CHARACTER_DENIED = (1 << 0),
+ UCL_CHARACTER_KEY = (1 << 1),
+ UCL_CHARACTER_KEY_START = (1 << 2),
+ UCL_CHARACTER_WHITESPACE = (1 << 3),
+ UCL_CHARACTER_WHITESPACE_UNSAFE = (1 << 4),
+ UCL_CHARACTER_VALUE_END = (1 << 5),
+ UCL_CHARACTER_VALUE_STR = (1 << 6),
+ UCL_CHARACTER_VALUE_DIGIT = (1 << 7),
+ UCL_CHARACTER_VALUE_DIGIT_START = (1 << 8),
+ UCL_CHARACTER_ESCAPE = (1 << 9),
+ UCL_CHARACTER_KEY_SEP = (1 << 10),
+ UCL_CHARACTER_JSON_UNSAFE = (1 << 11),
+ UCL_CHARACTER_UCL_UNSAFE = (1 << 12)
};
struct ucl_macro {