You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by sf...@apache.org on 2012/04/13 19:56:04 UTC

svn commit: r1325875 - /httpd/mod_mbox/branches/convert-charsets/module-2.0/mod_mbox_cte.c

Author: sf
Date: Fri Apr 13 17:56:03 2012
New Revision: 1325875

URL: http://svn.apache.org/viewvc?rev=1325875&view=rev
Log:
Fix buf in RFC2047 decoding with Q encoding if the string started with
'='

Modified:
    httpd/mod_mbox/branches/convert-charsets/module-2.0/mod_mbox_cte.c

Modified: httpd/mod_mbox/branches/convert-charsets/module-2.0/mod_mbox_cte.c
URL: http://svn.apache.org/viewvc/httpd/mod_mbox/branches/convert-charsets/module-2.0/mod_mbox_cte.c?rev=1325875&r1=1325874&r2=1325875&view=diff
==============================================================================
--- httpd/mod_mbox/branches/convert-charsets/module-2.0/mod_mbox_cte.c (original)
+++ httpd/mod_mbox/branches/convert-charsets/module-2.0/mod_mbox_cte.c Fri Apr 13 17:56:03 2012
@@ -298,6 +298,9 @@ out:
  *
  * These strings complies to the following syntax :
  * =?charset?mode?data?= rest
+ *
+ * Appends decoded string to vb, resturns
+ * position where to continue parsing.
  */
 static char *mbox_cte_decode_rfc2047(apr_pool_t *p, char *src, struct ap_varbuf *vb)
 {
@@ -312,24 +315,22 @@ static char *mbox_cte_decode_rfc2047(apr
 
     /* Encoding mode (first '?' after charset) */
     mode = strstr(charset, "?");
-    if (!mode || mode == src) {
+    if (!mode) {
         return src;
     }
     mode++;
 
     /* Fetch data */
     data = strstr(mode, "?");
-    if (!data || data != mode + 1) {
+    if (!data || data != mode + 1)
         return src;
-    }
     data++;
 
     /* Look for the end bound */
     rest = strstr(data, "?=");
-    if (!rest) {
+    if (!rest)
         return src;
-    }
-    *rest = '\0';
+    data = apr_pstrmemdup(p, data, rest - data);
 
     /* Quoted-Printable decoding : mode 'q' */
     if ((*mode == 'q') || (*mode == 'Q')) {
@@ -351,8 +352,6 @@ static char *mbox_cte_decode_rfc2047(apr
         data_len = mbox_cte_decode_b64(data);
     }
     else {
-        /* XXX we may have modified data above */
-        *rest = '?';
         return src;
     }
 
@@ -376,7 +375,7 @@ static char *mbox_cte_decode_rfc2047(apr
 /* MIME header decoding (see RFC 2047). */
 char *mbox_cte_decode_header(apr_pool_t *p, char *src)
 {
-    char *start, *end = NULL, *cont;
+    char *start, *cont;
     struct ap_varbuf vb;
     int seen_encoded_word = 0;
     if (src == NULL || *src == '\0')
@@ -386,9 +385,7 @@ char *mbox_cte_decode_header(apr_pool_t 
 
     do {
         start = strstr(src, "=?");
-        if (start)
-            end = strstr(start, "?=");
-        if (!start || !end) {
+        if (!start) {
             if (vb.strlen == 0)
                 return src;
             return apr_pstrcat(p, vb.buf, src, NULL);
@@ -412,10 +409,9 @@ char *mbox_cte_decode_header(apr_pool_t 
 
         cont = mbox_cte_decode_rfc2047(p, start, &vb);
         if (cont == start) {
-            /* decoding failed, copy original string */
-            end += 2;
-            ap_varbuf_strmemcat(&vb, start, end - start);
-            src = end;
+            /* decoding failed, copy start delimiter and continue */
+            ap_varbuf_strmemcat(&vb, start, 2);
+            src = start + 2;
         }
         else {
             src = cont;