Handle \n in tls_peerdn for spool files.
authorPhil Pennock <pdp@exim.org>
Fri, 27 Apr 2012 09:39:59 +0000 (02:39 -0700)
committerPhil Pennock <pdp@exim.org>
Fri, 27 Apr 2012 09:39:59 +0000 (02:39 -0700)
Fixes bug 1240.

src/src/functions.h
src/src/spool_in.c
src/src/spool_out.c
src/src/string.c

index 9e8a9546f30437fd26e72e707720d16607c9299f..f1af42ee589a5449000616a37baf9dc211516c80 100644 (file)
@@ -331,6 +331,7 @@ extern uschar *string_nextinlist(uschar **, int *, uschar *, int);
 extern uschar *string_open_failed(int, const char *, ...) PRINTF_FUNCTION(2,3);
 extern uschar *string_printing2(uschar *, BOOL);
 extern uschar *string_split_message(uschar *);
+extern uschar *string_unprinting(uschar *);
 extern BOOL    string_vformat(uschar *, int, const char *, va_list);
 extern int     strcmpic(const uschar *, const uschar *);
 extern int     strncmpic(const uschar *, const uschar *, int);
index 0e4bc413df8a7a74b3f7bfdca66ab9d89bb22e62..e0d7fcffe6a25ae5ca1626834f4d47b438b550c1 100644 (file)
@@ -548,7 +548,7 @@ for (;;)
     else if (Ustrncmp(p, "ls_cipher", 9) == 0)
       tls_cipher = string_copy(big_buffer + 12);
     else if (Ustrncmp(p, "ls_peerdn", 9) == 0)
-      tls_peerdn = string_copy(big_buffer + 12);
+      tls_peerdn = string_unprinting(string_copy(big_buffer + 12));
     break;
     #endif
 
index f84cda64217f1d7f95ba4ecbed6a7ee1c9b0f208..7b8229934d63ab688034c865b8a83465a2bc749b 100644 (file)
@@ -228,7 +228,7 @@ if (bmi_verdicts != NULL) fprintf(f, "-bmi_verdicts %s\n", bmi_verdicts);
 #ifdef SUPPORT_TLS
 if (tls_certificate_verified) fprintf(f, "-tls_certificate_verified\n");
 if (tls_cipher != NULL) fprintf(f, "-tls_cipher %s\n", tls_cipher);
-if (tls_peerdn != NULL) fprintf(f, "-tls_peerdn %s\n", tls_peerdn);
+if (tls_peerdn != NULL) fprintf(f, "-tls_peerdn %s\n", string_printing(tls_peerdn));
 #endif
 
 /* To complete the envelope, write out the tree of non-recipients, followed by
index 1c1f2dd83304cb2b65712b5d73c75b8fabb43c70..ece200bccda5a2807e05b93d1106322917bdbc19 100644 (file)
@@ -242,9 +242,12 @@ if (isdigit(ch) && ch != '8' && ch != '9')
   }
 else switch(ch)
   {
+  case 'b':  ch = '\b'; break;
+  case 'f':  ch = '\f'; break;
   case 'n':  ch = '\n'; break;
   case 'r':  ch = '\r'; break;
   case 't':  ch = '\t'; break;
+  case 'v':  ch = '\v'; break;
   case 'x':
   ch = 0;
   if (isxdigit(p[1]))
@@ -327,6 +330,72 @@ while (*t != 0)
     }
   }
 *tt = 0;
+return ss;
+}
+
+/*************************************************
+*        Undo printing escapes in string         *
+*************************************************/
+
+/* This function is the reverse of string_printing2.  It searches for
+backslash characters and if any are found, it makes a new copy of the
+string with escape sequences parsed.  Otherwise it returns the original
+string.
+
+Arguments:
+  s             the input string
+
+Returns:        string with printing escapes parsed back
+*/
+
+uschar *
+string_unprinting(uschar *s)
+{
+uschar *p, *q, *r, *ss;
+int len, off;
+
+p = Ustrchr(s, '\\');
+if (!p) return s;
+
+len = Ustrlen(s) + 1;
+ss = store_get(len);
+
+q = ss;
+off = p - s;
+if (off)
+  {
+  memcpy(q, s, off);
+  q += off;
+  }
+
+while (*p)
+  {
+  if (*p == '\\')
+    {
+    *q = string_interpret_escape(&p);
+    }
+  else
+    {
+    r = Ustrchr(p, '\\');
+    if (!r)
+      {
+      off = Ustrlen(p);
+      memcpy(q, p, off);
+      p += off;
+      q += off;
+      break;
+      }
+    else
+      {
+      off = r - p;
+      memcpy(q, p, off);
+      q += off;
+      p = r;
+      }
+    }
+  }
+*q = '\0';
+
 return ss;
 }
 #endif  /* COMPILE_UTILITY */