]> granicus.if.org Git - neomutt/commit
[patch-0.94.4i.tlr.rfc822_leak.1] Fixing a memory leak in
authorThomas Roessler <roessler@does-not-exist.org>
Wed, 26 Aug 1998 19:13:33 +0000 (19:13 +0000)
committerThomas Roessler <roessler@does-not-exist.org>
Wed, 26 Aug 1998 19:13:33 +0000 (19:13 +0000)
commitb8656eebecc4f8ae1f02087bda4b4e7eec46d0c4
tree7ddc0364e47b71867e985729860ae18d5fd12973
parent56be09d629974049f8a2f891cd8c85058824d031
[patch-0.94.4i.tlr.rfc822_leak.1] Fixing a memory leak in
the rfc822_parse_adrlist().

Some explanations seem to be in order here.  Let's look at
the code:

   386     else if (*s == ';')
   387     {
   388       if (phraselen)
   389       {
   390 phrase[phraselen] = 0;
   391 add_addrspec (&top, &last, phrase, comment, &commentlen, sizeof (comment) - 1);
   392       }
   393       else if (commentlen && !last->personal)
   394       {
   395 comment[commentlen] = 0;
   396 last->personal = safe_strdup (comment);
   397       }
   398 #ifdef EXACT_ADDRESS
   399       if (last && !last->val)

Line 399 contains the change; previously, it looked like
this:

   399'       if (last)

   400 last->val = mutt_substrdup (begin, s);
   401 #endif
   402
   403       /* add group terminator */
   404       cur = rfc822_new_address ();
   405       if (last)
   406       {
   407 last->next = cur;
   408 last = cur;
   409       }
   410
   411       phraselen = 0;
   412       commentlen = 0;
   413       s++;
   414       begin = s;
   415       SKIPWS (begin);
   416     }

OK, what happens? There are essentially two situations here:

-> We have already parsed a complete address specification
   and know about this fact, but there was no new address
   information.  This is the case if we are parsing
   through addresses like

undisclosed-recipients:;

   or

recipients: a, b, c,;

   (Note the extra ',' before the ';'!)

   In this case, some of the other code in rfc822.c has
   already filled in last->val, and we really shouldn't
   overwrite that with a NULL pointer.

-> The ';' finishes an address spec, like in

recipients: a;

   In this case, last is either set by add_addrspec(), or
   it has already been set by some of the previous code
   (comment handling, ...).  Anyway, last->val is still
   NULL, so it is correct to write the complete addr spec
   to last->val.
TODO
rfc822.c