]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Add str_nescape
authorAki Tuomi <aki.tuomi@dovecot.fi>
Sat, 10 Mar 2018 16:20:32 +0000 (18:20 +0200)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Fri, 23 Mar 2018 13:01:01 +0000 (13:01 +0000)
For partial escaping

src/lib/strescape.c
src/lib/strescape.h
src/lib/test-strescape.c

index 85dc08ea7826481cb82ffa8fef532a4fe5eb5c32..6312367f2a4b9134d30fdb0770bea96214be9dc7 100644 (file)
@@ -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);
 }
index c910a2682574325d0df2f7616f1cf28de80c965d..b4658ce21c2bda54ad51a456aca5543fa5e6678c 100644 (file)
@@ -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);
index 2f47b113ac67642651d79946f16931851aeb728c..b918062d1d817f398497b068cb9e94ae0d8c50d7 100644 (file)
@@ -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++) {