]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Add binary-safe tabescape
authorAki Tuomi <aki.tuomi@dovecot.fi>
Mon, 8 Aug 2016 08:23:02 +0000 (11:23 +0300)
committerGitLab <gitlab@git.dovecot.net>
Mon, 8 Aug 2016 11:23:58 +0000 (14:23 +0300)
src/lib/strescape.c
src/lib/strescape.h

index 75641c21e3630f31803fa38e0bf68019a6d856a1..e0a1cb7d25d45c1eabb862ac977bb9cf5fa7d72c 100644 (file)
@@ -101,10 +101,14 @@ int str_unescape_next(const char **str, const char **unescaped_r)
        return 0;
 }
 
-void str_append_tabescaped(string_t *dest, const char *src)
+void str_append_tabescaped_n(string_t *dest, const unsigned char *src, size_t src_size)
 {
-       for (; *src != '\0'; src++) {
-               switch (*src) {
+       for (size_t i = 0; i < src_size; i++) {
+               switch (src[i]) {
+               case '\000':
+                       str_append_c(dest, '\001');
+                       str_append_c(dest, '0');
+                       break;
                case '\001':
                        str_append_c(dest, '\001');
                        str_append_c(dest, '1');
@@ -122,12 +126,17 @@ void str_append_tabescaped(string_t *dest, const char *src)
                        str_append_c(dest, 'n');
                        break;
                default:
-                       str_append_c(dest, *src);
+                       str_append_c(dest, src[i]);
                        break;
                }
        }
 }
 
+void str_append_tabescaped(string_t *dest, const char *src) {
+       str_append_tabescaped_n(dest, (const unsigned char*)src, strlen(src));
+}
+
+
 const char *str_tabescape(const char *str)
 {
        string_t *tmp;
@@ -161,6 +170,9 @@ void str_append_tabunescaped(string_t *dest, const void *src, size_t src_size)
                        i++;
                        if (i < src_size) {
                                switch (src_c[i]) {
+                               case '0':
+                                       str_append_c(dest, '\000');
+                                       break;
                                case '1':
                                        str_append_c(dest, '\001');
                                        break;
@@ -203,6 +215,9 @@ char *str_tabunescape(char *str)
                        if (*str == '\0')
                                break;
                        switch (*str) {
+                       case '0':
+                               *dest++ = '\000';
+                               break;
                        case '1':
                                *dest++ = '\001';
                                break;
index 550e3adfac3ce5649a00ee69b7f3252f746f5690..acf7cba67d5b13d7c2c899f8d90ae80ab806b902 100644 (file)
@@ -21,6 +21,7 @@ int str_unescape_next(const char **str, const char **unescaped_r);
    using \001. */
 const char *str_tabescape(const char *str);
 void str_append_tabescaped(string_t *dest, const char *src);
+void str_append_tabescaped_n(string_t *dest, const unsigned char *src, size_t src_size);
 void str_append_tabunescaped(string_t *dest, const void *src, size_t src_size);
 char *str_tabunescape(char *str);
 const char *t_str_tabunescape(const char *str);