]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added str_tabescape*() to write escaped strings to Dovecot's IPC protocols.
authorTimo Sirainen <tss@iki.fi>
Wed, 6 May 2009 00:25:13 +0000 (20:25 -0400)
committerTimo Sirainen <tss@iki.fi>
Wed, 6 May 2009 00:25:13 +0000 (20:25 -0400)
--HG--
branch : HEAD

src/auth/auth-stream.c
src/lib/strescape.c
src/lib/strescape.h

index 3140d82283ca6dab686368b9665bcc9544382914..8a15bc9a06ba16f1c55145b6b529f7f0f1dbb3d4 100644 (file)
@@ -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);
        }
 }
 
index 6d9b049f8e4585fc9409787191dd13f38ac19100..fb047abd8439899121c6694d36db900ece19d82a 100644 (file)
@@ -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;
+}
index 2587da4600965f1334ca18525d5317fb8393df9c..0918b65bf9d6f1627ee134d8d128d82a66735f1d 100644 (file)
@@ -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