From: Timo Sirainen Date: Wed, 6 May 2009 00:25:13 +0000 (-0400) Subject: Added str_tabescape*() to write escaped strings to Dovecot's IPC protocols. X-Git-Tag: 2.0.alpha1~820 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=146e7e3fabdd843d50680cdb6e4f7829890f5fcf;p=thirdparty%2Fdovecot%2Fcore.git Added str_tabescape*() to write escaped strings to Dovecot's IPC protocols. --HG-- branch : HEAD --- diff --git a/src/auth/auth-stream.c b/src/auth/auth-stream.c index 3140d82283..8a15bc9a06 100644 --- a/src/auth/auth-stream.c +++ b/src/auth/auth-stream.c @@ -2,6 +2,7 @@ #include "auth-common.h" #include "str.h" +#include "strescape.h" #include "ostream.h" #include "auth-request.h" #include "auth-stream.h" @@ -35,25 +36,7 @@ void auth_stream_reply_add(struct auth_stream_reply *reply, } if (value != NULL) { /* escape dangerous characters in the value */ - for (; *value != '\0'; value++) { - switch (*value) { - case '\001': - str_append_c(reply->str, '\001'); - str_append_c(reply->str, '1'); - break; - case '\t': - str_append_c(reply->str, '\001'); - str_append_c(reply->str, 't'); - break; - case '\n': - str_append_c(reply->str, '\001'); - str_append_c(reply->str, 'n'); - break; - default: - str_append_c(reply->str, *value); - break; - } - } + str_tabescape_write(reply->str, value); } } diff --git a/src/lib/strescape.c b/src/lib/strescape.c index 6d9b049f8e..fb047abd84 100644 --- a/src/lib/strescape.c +++ b/src/lib/strescape.c @@ -71,3 +71,42 @@ char *str_unescape(char *str) *dest = '\0'; return start; } + +void str_tabescape_write(string_t *dest, const char *src) +{ + for (; *src != '\0'; src++) { + switch (*src) { + case '\001': + str_append_c(dest, '\001'); + str_append_c(dest, '1'); + break; + case '\t': + str_append_c(dest, '\001'); + str_append_c(dest, 't'); + break; + case '\n': + str_append_c(dest, '\001'); + str_append_c(dest, 'n'); + break; + default: + str_append_c(dest, *src); + break; + } + } +} + +const char *str_tabescape(const char *str) +{ + string_t *tmp; + const char *p; + + for (p = str; *p != '\0'; p++) { + if (*p <= '\n') { + tmp = t_str_new(128); + str_append_n(tmp, str, p-str); + str_tabescape_write(tmp, p); + return str_c(tmp); + } + } + return str; +} diff --git a/src/lib/strescape.h b/src/lib/strescape.h index 2587da4600..0918b65bf9 100644 --- a/src/lib/strescape.h +++ b/src/lib/strescape.h @@ -12,4 +12,9 @@ void str_append_unescaped(string_t *dest, const void *src, size_t src_size); /* remove all '\' characters */ char *str_unescape(char *str); +/* For Dovecot's internal protocols: Escape \001, \t and \n characters + using \001. */ +const char *str_tabescape(const char *str); +void str_tabescape_write(string_t *dest, const char *src); + #endif