]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Optimize t_str_tabunescape()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 11 Mar 2021 23:41:35 +0000 (01:41 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 21 Sep 2021 07:12:53 +0000 (07:12 +0000)
src/lib/strescape.c

index 012689b8b705bf09aeb070a2e5eb740d6d80f08a..eb3fc3bcc770d1e08af91b70f766a3e40132c805 100644 (file)
@@ -226,16 +226,10 @@ void str_append_tabunescaped(string_t *dest, const void *src, size_t src_size)
        }
 }
 
-char *str_tabunescape(char *str)
+static char *str_tabunescape_from(char *str, char *src)
 {
        /* @UNSAFE */
-       char *dest, *src, *p;
-
-       src = strchr(str, '\001');
-       if (src == NULL) {
-               /* no unescaping needed */
-               return str;
-       }
+       char *dest, *p;
 
        dest = src;
        for (;;) {
@@ -279,12 +273,26 @@ char *str_tabunescape(char *str)
        return str;
 }
 
+char *str_tabunescape(char *str)
+{
+       char *src = strchr(str, '\001');
+       if (src == NULL) {
+               /* no unescaping needed */
+               return str;
+       }
+       return str_tabunescape_from(str, src);
+}
+
 const char *t_str_tabunescape(const char *str)
 {
-       if (strchr(str, '\001') == NULL)
+       const char *p;
+
+       p = strchr(str, '\001');
+       if (p == NULL)
                return str;
-       else
-               return str_tabunescape(t_strdup_noconst(str));
+
+       char *dest = t_strdup_noconst(str);
+       return str_tabunescape_from(dest, dest + (p - str));
 }
 
 const char *const *t_strsplit_tabescaped_inplace(char *data)