# HG changeset patch # User Timo Sirainen # Date 1241569513 14400 # Node ID 2dcf2f31332987220184786f8211946b6566ff4e # Parent 8f770c8ad19894c8e1785c07fc1645993014ca82 Added str_tabescape*() to write escaped strings to Dovecot's IPC protocols. diff -r 8f770c8ad198 -r 2dcf2f313329 src/auth/auth-stream.c --- a/src/auth/auth-stream.c Tue May 05 18:47:54 2009 -0400 +++ b/src/auth/auth-stream.c Tue May 05 20:25:13 2009 -0400 @@ -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 @@ } 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 -r 8f770c8ad198 -r 2dcf2f313329 src/lib/strescape.c --- a/src/lib/strescape.c Tue May 05 18:47:54 2009 -0400 +++ b/src/lib/strescape.c Tue May 05 20:25:13 2009 -0400 @@ -71,3 +71,42 @@ *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 -r 8f770c8ad198 -r 2dcf2f313329 src/lib/strescape.h --- a/src/lib/strescape.h Tue May 05 18:47:54 2009 -0400 +++ b/src/lib/strescape.h Tue May 05 20:25:13 2009 -0400 @@ -12,4 +12,9 @@ /* 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