<<< Date Index >>>     <<< Thread Index >>>

[Mutt] #2968: "mailto:" URL parsing stops at "references" header



#2968: "mailto:"; URL parsing stops at "references" header

 The following command line:
  mutt
 
'mailto:user@xxxxxxxxxxx?Subject=subj&References=%3c153185.7884%40example.org%3e&From=luser@xxxxxxxxxxx'
 does not take into account the given "From" header. More generally,
 any header (or body) that is put after the "References" header is
 ignored. For example,
  mutt
 
'mailto:user@xxxxxxxxxxx?From=luser@example.net'&References=%3c153185.7884%40example.org%3e&Subject=subj
 &Reply-To=luser.name@xxxxxxxxxxx
 will take into account the "From" header, but neither the "Subject",
 nor the "Reply-To".

 That is because in this situation mutt uses the non-reentrant strtok
 in a nested way. More precisely:
  - "mailto:"; URL parsing happens in function url_parse_mailto (file
    url.c).
  - that function calls strtok once with 'headers' as first argument
    and then with 'NULL' as first argument, to continue advancing in
    the same string.
  - but if the header being parsed is "References" (that is 'tag' is
    that string), then mutt_parse_rfc822_line (which finished the for
    loop) (file parse.c) will call mutt_parse_references, which will in
    turn call strtok() with a non-NULL first argument. (And then with
    NULL argument until it returns NULL.)
  - when the for loop in url_parse_mailto proceeds, the
    strtok(NULL,...) call proceeds on the string passed by
    mutt_parse_references, but it is already at its end, and returns
    NULL, terminating that function.


 The attached patch changes all calls to strtok to the reentrant
 strtok_r, fixing that problem. If strtok_r is not available on all
 platforms, I suggest you just ship a private copy of the one in the GNU
 libc (or a BSD libc); mutt being GPL, this is AFAIK permitted.

-- 
Ticket URL: <http://dev.mutt.org/trac/ticket/2968>