From: Aki Tuomi Date: Sat, 10 Mar 2018 16:20:32 +0000 (+0200) Subject: lib: Add str_nescape X-Git-Tag: 2.3.9~2055 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9b40bf3a6a085130639c0100f5003838e47ebfee;p=thirdparty%2Fdovecot%2Fcore.git lib: Add str_nescape For partial escaping --- diff --git a/src/lib/strescape.c b/src/lib/strescape.c index 85dc08ea78..6312367f2a 100644 --- a/src/lib/strescape.c +++ b/src/lib/strescape.c @@ -4,28 +4,27 @@ #include "str.h" #include "strescape.h" -const char *str_escape(const char *str) +const char *str_nescape(const void *str, size_t len) { - const char *p; + const unsigned char *s = str, *p = str; string_t *ret; - /* see if we need to quote it */ - for (p = str; *p != '\0'; p++) { + for (p = str; (size_t)(p - s) < len; p++) { if (IS_ESCAPED_CHAR(*p)) break; } - if (*p == '\0') + if (p == (s + len)) return str; /* quote */ - ret = t_str_new((size_t) (p - str) + 128); - str_append_n(ret, str, (size_t) (p - str)); + ret = t_str_new((size_t)(p - s) + 128); + str_append_n(ret, s, (size_t)(p - s)); - for (; *p != '\0'; p++) { + for (; (size_t)(p - s) < len; p++) { if (IS_ESCAPED_CHAR(*p)) str_append_c(ret, '\\'); - str_append_c(ret, *p); + str_append_data(ret, p, 1); } return str_c(ret); } diff --git a/src/lib/strescape.h b/src/lib/strescape.h index c910a26825..b4658ce21c 100644 --- a/src/lib/strescape.h +++ b/src/lib/strescape.h @@ -3,8 +3,15 @@ #define IS_ESCAPED_CHAR(c) ((c) == '"' || (c) == '\\' || (c) == '\'') -/* escape all '\', '"' and "'" characters */ -const char *str_escape(const char *str); +/* escape all '\', '"' and "'" characters, + this is nul safe */ +const char *str_nescape(const void *str, size_t len); + +/* escape string */ +static inline const char *str_escape(const char *str) +{ + return str_nescape(str, strlen(str)); +} /* remove all '\' characters, append to given string */ void str_append_unescaped(string_t *dest, const void *src, size_t src_size); diff --git a/src/lib/test-strescape.c b/src/lib/test-strescape.c index 2f47b113ac..b918062d1d 100644 --- a/src/lib/test-strescape.c +++ b/src/lib/test-strescape.c @@ -71,6 +71,16 @@ static void test_str_escape(void) "\\\\\\\\\\\"\\\"\\\'\\\'") == 0); test_end(); + test_begin("str_nescape"); + + escaped = str_nescape("\"escape only first but not 'this'", 10); + test_assert(strcmp(escaped, "\\\"escape on") == 0); + + escaped = str_nescape("\"hello\"\0\"world\"", 15); + test_assert(memcmp(escaped, "\\\"hello\\\"\0\\\"world\\\"", 19) == 0); + + test_end(); + str = t_str_new(256); test_begin("str_unescape"); for (i = 0; i < N_ELEMENTS(unesc); i++) {