]> granicus.if.org Git - mutt/commitdiff
rfc2047_decode change from EGE.
authorThomas Roessler <roessler@does-not-exist.org>
Thu, 18 May 2000 17:06:59 +0000 (17:06 +0000)
committerThomas Roessler <roessler@does-not-exist.org>
Thu, 18 May 2000 17:06:59 +0000 (17:06 +0000)
copy.c
parse.c
rfc2047.c
rfc2047.h
rfc2231.c
send.c
sendlib.c

diff --git a/copy.c b/copy.c
index 294d2f8fac763ef054303fdcadeb930d722b70f3..6f7e22b336fb9da500d82be99fe52879a36e3b8d 100644 (file)
--- a/copy.c
+++ b/copy.c
@@ -205,7 +205,7 @@ mutt_copy_hdr (FILE *in, FILE *out, long off_start, long off_end, int flags,
     if (headers[x])
     {
       if (flags & CH_DECODE)
-       rfc2047_decode (headers[x], headers[x], mutt_strlen (headers[x]) + 1);
+       rfc2047_decode (&headers[x]);
 
       /* We couldn't do the prefixing when reading because RFC 2047
        * decoding may have concatenated lines.
diff --git a/parse.c b/parse.c
index 7564f07149c5b39ccd2f5642f2cf54c7eab469bb..78255bb4025ef6ac5725a5e2e7b82296a4097f00 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -427,7 +427,7 @@ BODY *mutt_read_mime_header (FILE *fp, int digest)
       else if (!mutt_strcasecmp ("description", line + 8))
       {
        mutt_str_replace (&p->description, c);
-       rfc2047_decode (p->description, p->description, mutt_strlen (p->description) + 1);
+       rfc2047_decode (&p->description);
       }
     } 
 #ifdef SUN_ATTACHMENT
@@ -443,7 +443,7 @@ BODY *mutt_read_mime_header (FILE *fp, int digest)
       {
         safe_free ((void **) &p->description);
         p->description = safe_strdup (c);
-        rfc2047_decode (p->description, p->description, mutt_strlen (p->description) + 1);
+        rfc2047_decode (&p->description);
       }
     }
 #endif
@@ -932,13 +932,11 @@ ENVELOPE *mutt_read_rfc822_header (FILE *f, HEADER *hdr, short user_hdrs,
   LIST *last = NULL;
   char *line = safe_malloc (LONG_STRING);
   char *p;
-  char in_reply_to[STRING];
+  char *in_reply_to = 0;
   long loc;
   int matched;
   size_t linelen = LONG_STRING;
 
-  in_reply_to[0] = 0;
-
   if (hdr)
   {
     if (hdr->content == NULL)
@@ -1044,9 +1042,7 @@ ENVELOPE *mutt_read_rfc822_header (FILE *f, HEADER *hdr, short user_hdrs,
            if (hdr)
            {
              mutt_str_replace (&hdr->content->description, p);
-             rfc2047_decode (hdr->content->description,
-                             hdr->content->description,
-                             mutt_strlen (hdr->content->description) + 1);
+             rfc2047_decode (&hdr->content->description);
            }
            matched = 1;
          }
@@ -1088,9 +1084,8 @@ ENVELOPE *mutt_read_rfc822_header (FILE *f, HEADER *hdr, short user_hdrs,
        {
          if (hdr)
          {
-           strfcpy (in_reply_to, p, sizeof (in_reply_to));
-           rfc2047_decode (in_reply_to, in_reply_to,
-                           sizeof (in_reply_to));
+           in_reply_to = strdup (p);
+           rfc2047_decode (&in_reply_to);
          }
        }
        break;
@@ -1266,7 +1261,7 @@ ENVELOPE *mutt_read_rfc822_header (FILE *f, HEADER *hdr, short user_hdrs,
       }
       else
        last = e->userhdrs = mutt_new_list ();
-      rfc2047_decode (line, line, linelen);
+      rfc2047_decode (&line);
       last->data = safe_strdup (line);
     }
   }
@@ -1281,7 +1276,7 @@ ENVELOPE *mutt_read_rfc822_header (FILE *f, HEADER *hdr, short user_hdrs,
     /* if an in-reply-to was given, check to see if it is in the references
      * list already.  if not, add it so we can do a better job of threading.
      */
-    if (in_reply_to[0] && (p = extract_message_id (in_reply_to)) != NULL)
+    if (in_reply_to && (p = extract_message_id (in_reply_to)) != NULL)
     {
       if (!e->references ||
          (e->references && mutt_strcmp (e->references->data, p) != 0))
@@ -1309,7 +1304,7 @@ ENVELOPE *mutt_read_rfc822_header (FILE *f, HEADER *hdr, short user_hdrs,
     {
       regmatch_t pmatch[1];
 
-      rfc2047_decode (e->subject, e->subject, mutt_strlen (e->subject) + 1);
+      rfc2047_decode (&e->subject);
 
       if (regexec (ReplyRegexp.rx, e->subject, 1, pmatch, 0) == 0)
        e->real_subj = e->subject + pmatch[0].rm_eo;
@@ -1325,6 +1320,7 @@ ENVELOPE *mutt_read_rfc822_header (FILE *f, HEADER *hdr, short user_hdrs,
     }
   }
 
+  safe_free ((void *) &in_reply_to);
   return (e);
 }
 
index df5bd33fa791b6778821b853f4a1c1f2210e55ab..c131b2a5bd898c0e8722fa302a10e415de029e2a 100644 (file)
--- a/rfc2047.c
+++ b/rfc2047.c
@@ -373,14 +373,20 @@ static int rfc2047_decode_word (char *d, const char *s, size_t len)
 /* try to decode anything that looks like a valid RFC2047 encoded
  * header field, ignoring RFC822 parsing rules
  */
-void rfc2047_decode (char *d, const char *s, size_t dlen)
+void rfc2047_decode (char **pd)
 {
   const char *p, *q;
   size_t n;
   int found_encoded = 0;
-  int in_place = (d == s);
-  dlen--; /* save room for the terminal nul */
+  char *d0, *d;
+  const char *s = *pd;
+  size_t dlen;
+
+  if (!*s)
+    return;
+
+  dlen = MB_LEN_MAX * strlen (s); /* should be enough */
+  d = d0 = safe_malloc (dlen + 1);
 
   while (*s && dlen > 0)
   {
@@ -390,9 +396,9 @@ void rfc2047_decode (char *d, const char *s, size_t dlen)
        (q = strstr (q + 1, "?=")) == NULL)
     {
       /* no encoded words */
-      if (d != s)
-       strfcpy (d, s, dlen + 1);
-      return;
+      strncpy (d, s, dlen);
+      d += dlen;
+      break;
     }
 
     if (p != s)
@@ -410,7 +416,7 @@ void rfc2047_decode (char *d, const char *s, size_t dlen)
       }
     }
 
-    rfc2047_decode_word (d, p, in_place ? q + 2 - p : dlen);
+    rfc2047_decode_word (d, p, dlen);
     found_encoded = 1;
     s = q + 2;
     n = mutt_strlen (d);
@@ -418,6 +424,8 @@ void rfc2047_decode (char *d, const char *s, size_t dlen)
     d += n;
   }
   *d = 0;
+  *pd = strdup (d0);
+  safe_free ((void **) &d0);
 }
 
 void rfc2047_decode_adrlist (ADDRESS *a)
@@ -425,10 +433,10 @@ void rfc2047_decode_adrlist (ADDRESS *a)
   while (a)
   {
     if (a->personal && strstr (a->personal, "=?") != NULL)
-      rfc2047_decode (a->personal, a->personal, mutt_strlen (a->personal) + 1);
+      rfc2047_decode (&a->personal);
 #ifdef EXACT_ADDRESS
     if (a->val && strstr (a->val, "=?") != NULL)
-      rfc2047_decode (a->val, a->val, mutt_strlen (a->val) + 1);
+      rfc2047_decode (&a->val);
 #endif
     a = a->next;
   }
index ac664907e385cb300962a8873d3a945c0a76f2de..291d65661575a3cddf5ef42749b76f4d2a76ad0c 100644 (file)
--- a/rfc2047.h
+++ b/rfc2047.h
@@ -19,5 +19,5 @@
 void rfc2047_encode_string (char *, size_t, const unsigned char *);
 void rfc2047_encode_adrlist (ADDRESS *);
 
-void rfc2047_decode (char *, const char *, size_t);
+void rfc2047_decode (char **);
 void rfc2047_decode_adrlist (ADDRESS *);
index 4441a7383d1aca8e74997dff73d551ba4337382a..61fc9b692ff541fa96c0c57791dc1a17a2c7727d 100644 (file)
--- a/rfc2231.c
+++ b/rfc2231.c
@@ -112,7 +112,7 @@ void rfc2231_decode_parameters (PARAMETER **headp)
        */
 
       if (option (OPTRFC2047PARAMS) && p->value && strstr (p->value, "=?"))
-       rfc2047_decode (p->value, p->value, strlen (p->value) + 1);
+       rfc2047_decode (&p->value);
 
       *last = p;
       last = &p->next;
diff --git a/send.c b/send.c
index d48bd5347f2fc902c78fec5cfa7c7c5cc0771d6f..21526326b48adc4c95c1832a4f32f2829d08653b 100644 (file)
--- a/send.c
+++ b/send.c
@@ -969,15 +969,12 @@ static void encode_descriptions (BODY *b, short recurse)
 static void decode_descriptions (BODY *b)
 {
   BODY *t;
-  char tmp[LONG_STRING];
   
   for (t = b; t; t = t->next)
   {
     if (t->description)
     {
-      /* this should really have the same interface as rfc2047_encode_string. */
-      rfc2047_decode (tmp, t->description, sizeof (tmp));
-      mutt_str_replace (&t->description, tmp);
+      rfc2047_decode (&t->description);
     }
     if (t->parts)
       decode_descriptions (t->parts);
index 840565bd36c90ee9db1546a3ad6cd95410184912..7173c94e61e147462a4e5fd3d4686b88748b6f15 100644 (file)
--- a/sendlib.c
+++ b/sendlib.c
@@ -1810,7 +1810,7 @@ void mutt_unprepare_envelope (ENVELOPE *env)
   LIST *item;
 
   for (item = env->userhdrs; item; item = item->next)
-    rfc2047_decode (item->data, item->data,  mutt_strlen (item->data) + 1);
+    rfc2047_decode (&item->data);
 
   rfc822_free_address (&env->mail_followup_to);
 
@@ -1819,7 +1819,7 @@ void mutt_unprepare_envelope (ENVELOPE *env)
   rfc2047_decode_adrlist (env->cc);
   rfc2047_decode_adrlist (env->from);
   rfc2047_decode_adrlist (env->reply_to);
-  rfc2047_decode (env->subject, env->subject, mutt_strlen (env->subject) + 1);
+  rfc2047_decode (&env->subject);
 }
 
 static void _mutt_bounce_message (FILE *fp, HEADER *h, ADDRESS *to, const char *resent_from)