diff options
author | Thomas Roessler <roessler@does-not-exist.org> | 1998-08-26 19:13:33 +0000 |
---|---|---|
committer | Thomas Roessler <roessler@does-not-exist.org> | 1998-08-26 19:13:33 +0000 |
commit | 17e73c0ac6d9d00b60940bec7baa9a728ffa1a9c (patch) | |
tree | 7ddc0364e47b71867e985729860ae18d5fd12973 /rfc822.c | |
parent | 00aa914c33cfc00ad80c15cb34981858fdb8d47e (diff) |
[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.
Diffstat (limited to 'rfc822.c')
-rw-r--r-- | rfc822.c | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -396,7 +396,7 @@ ADDRESS *rfc822_parse_adrlist (ADDRESS *top, const char *s) last->personal = safe_strdup (comment); } #ifdef EXACT_ADDRESS - if (last) + if (last && !last->val) last->val = mutt_substrdup (begin, s); #endif |