From: Timo Sirainen Date: Thu, 11 Mar 2021 23:38:13 +0000 (+0200) Subject: lib: Optimize str_tabunescape() X-Git-Tag: 2.3.17~98 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cd63b1eeea96794d18f8f899339478bdc32957aa;p=thirdparty%2Fdovecot%2Fcore.git lib: Optimize str_tabunescape() --- diff --git a/src/lib/strescape.c b/src/lib/strescape.c index 99482a5700..012689b8b7 100644 --- a/src/lib/strescape.c +++ b/src/lib/strescape.c @@ -229,46 +229,54 @@ void str_append_tabunescaped(string_t *dest, const void *src, size_t src_size) char *str_tabunescape(char *str) { /* @UNSAFE */ - char *dest, *start = str; + char *dest, *src, *p; - str = strchr(str, '\001'); - if (str == NULL) { + src = strchr(str, '\001'); + if (src == NULL) { /* no unescaping needed */ - return start; + return str; } - for (dest = str; *str != '\0'; str++) { - if (*str != '\001') - *dest++ = *str; - else { - str++; - if (*str == '\0') - break; - switch (*str) { - case '0': - *dest++ = '\000'; - break; - case '1': - *dest++ = '\001'; - break; - case 't': - *dest++ = '\t'; - break; - case 'r': - *dest++ = '\r'; - break; - case 'n': - *dest++ = '\n'; - break; - default: - *dest++ = *str; - break; - } + dest = src; + for (;;) { + switch (src[1]) { + case '\0': + /* truncated input */ + *dest = '\0'; + return str; + case '0': + *dest++ = '\000'; + break; + case '1': + *dest++ = '\001'; + break; + case 't': + *dest++ = '\t'; + break; + case 'r': + *dest++ = '\r'; + break; + case 'n': + *dest++ = '\n'; + break; + default: + *dest++ = src[1]; + break; } - } + src += 2; - *dest = '\0'; - return start; + p = strchr(src, '\001'); + if (p == NULL) { + memmove(dest, src, strlen(src)+1); + break; + } + + size_t copy_len = p - src; + memmove(dest, src, copy_len); + dest += copy_len; + src = p; + } + return str; } const char *t_str_tabunescape(const char *str)