diff options
author | Роман Донченко <dpb@corrigendum.ru> | 2014-12-14 18:59:47 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-12-15 09:06:40 -0800 |
commit | ab47e2a583917ecef5da269cc640f8359c8467ac (patch) | |
tree | 45104be9f5463dd7998e4f4f096d998b646a037f | |
parent | 11f70a7e29ff7167e89aad186d763a4b017e48d9 (diff) | |
download | git-rd/send-email-2047-fix.tar.gz |
send-email: handle adjacent RFC 2047-encoded words properlyrd/send-email-2047-fix
The RFC says that they are to be concatenated after decoding (i.e. the
intervening whitespace is ignored).
Signed-off-by: Роман Донченко <dpb@corrigendum.ru>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rwxr-xr-x | git-send-email.perl | 26 | ||||
-rwxr-xr-x | t/t9001-send-email.sh | 7 |
2 files changed, 23 insertions, 10 deletions
diff --git a/git-send-email.perl b/git-send-email.perl index 106c2b065d..cd327d7043 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -912,17 +912,23 @@ $time = time - scalar $#files; sub unquote_rfc2047 { local ($_) = @_; my $charset; - s{$re_encoded_word}{ - $charset = $1; - my $encoding = $2; - my $text = $3; - if ($encoding eq 'q' || $encoding eq 'Q') { - $text =~ s/_/ /g; - $text =~ s/=([0-9A-F]{2})/chr(hex($1))/egi; - $text; - } else { - $&; # other encodings not supported yet + my $sep = qr/[ \t]+/; + s{$re_encoded_word(?:$sep$re_encoded_word)*}{ + my @words = split $sep, $&; + foreach (@words) { + m/$re_encoded_word/; + $charset = $1; + my $encoding = $2; + my $text = $3; + if ($encoding eq 'q' || $encoding eq 'Q') { + $_ = $text; + s/_/ /g; + s/=([0-9A-F]{2})/chr(hex($1))/egi; + } else { + # other encodings not supported yet + } } + join '', @words; }eg; return wantarray ? ($_, $charset) : $_; } diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 1ecdacb6fd..f933bc7ec7 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -240,6 +240,13 @@ test_expect_success $PREREQ 'non-ascii self name is suppressed' " 'non_ascii_self_suppressed' " +# This name is long enough to force format-patch to split it into multiple +# encoded-words, assuming it uses UTF-8 with the "Q" encoding. +test_expect_success $PREREQ 'long non-ascii self name is suppressed' " + test_suppress_self_quoted 'Ƒüñníęř €. Nâṁé' 'odd_?=mail@example.com' \ + 'long_non_ascii_self_suppressed' +" + test_expect_success $PREREQ 'sanitized self name is suppressed' " test_suppress_self_unquoted '\"A U. Thor\"' 'author@example.com' \ 'self_name_sanitized_suppressed' |