]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Fix dealing with `\0` in ucl strings and JSON
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 13 Jan 2020 13:16:13 +0000 (13:16 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 13 Jan 2020 13:16:13 +0000 (13:16 +0000)
contrib/libucl/ucl_chartable.h
contrib/libucl/ucl_emitter.c
contrib/libucl/ucl_util.c

index db9f02900c0201f46de386425173d189c3450e56..043b62689921409e5fa69a85d27b5aa8653b1911 100644 (file)
@@ -27,7 +27,7 @@
 #include "ucl_internal.h"
 
 static const unsigned int ucl_chartable[256] = {
-UCL_CHARACTER_VALUE_END, UCL_CHARACTER_DENIED, UCL_CHARACTER_DENIED,
+UCL_CHARACTER_JSON_UNSAFE|UCL_CHARACTER_VALUE_END|UCL_CHARACTER_UCL_UNSAFE, UCL_CHARACTER_DENIED, UCL_CHARACTER_DENIED,
 UCL_CHARACTER_DENIED, UCL_CHARACTER_DENIED, UCL_CHARACTER_DENIED,
 UCL_CHARACTER_DENIED, UCL_CHARACTER_DENIED,
 UCL_CHARACTER_JSON_UNSAFE|UCL_CHARACTER_UCL_UNSAFE,
index d37cdda4062232b238610777be02d2f38dd12f01..687e6cdae0df4b6722268c931779c2f1e38102f5 100644 (file)
@@ -756,6 +756,9 @@ ucl_elt_string_write_json (const char *str, size_t size,
                                func->ucl_emitter_append_len (c, len, func->ud);
                        }
                        switch (*p) {
+                       case '\0':
+                               func->ucl_emitter_append_len ("\\u0000", 6, func->ud);
+                               break;
                        case '\n':
                                func->ucl_emitter_append_len ("\\n", 2, func->ud);
                                break;
index 5ef83e31b1ee8350eb78a3b7057ab56a4a691735..830aaa14c93ad9e07f67c1eb01b04212d9bddb06 100644 (file)
@@ -2244,6 +2244,7 @@ ucl_object_fromstring_common (const char *str, size_t len, enum ucl_string_flags
                                if (ucl_test_character (*p, UCL_CHARACTER_JSON_UNSAFE | UCL_CHARACTER_WHITESPACE_UNSAFE)) {
                                        switch (*p) {
                                        case '\v':
+                                       case '\0':
                                                escaped_len += 5;
                                                break;
                                        case ' ':
@@ -2279,6 +2280,14 @@ ucl_object_fromstring_common (const char *str, size_t len, enum ucl_string_flags
                                                        *d++ = '\\';
                                                        *d = 'f';
                                                        break;
+                                               case '\0':
+                                                       *d++ = '\\';
+                                                       *d++ = 'u';
+                                                       *d++ = '0';
+                                                       *d++ = '0';
+                                                       *d++ = '0';
+                                                       *d   = '0';
+                                                       break;
                                                case '\v':
                                                        *d++ = '\\';
                                                        *d++ = 'u';