Skip to content

Commit

Permalink
send-email: Don't leak To: headers between patches
Browse files Browse the repository at this point in the history
If the first patch in a series has a To: header in the file and the
second patch in the series doesn't the address from the first patch will
be part of the To: addresses in the second patch. Fix this by treating the
to list like the cc list. Have an initial to list come from the command
line, user input and config options. Then build up a to list from each
patch and concatenate the two together before sending the patch. Finally,
reset the list after sending each patch so the To: headers from a patch
don't get used for the next one.

Reported-by: Viresh Kumar <viresh.kumar@st.com>
Signed-off-by: Stephen Boyd <bebarino@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Stephen Boyd authored and Junio C Hamano committed Oct 4, 2010
1 parent 21802cd commit 3c3bb51
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 8 deletions.
18 changes: 10 additions & 8 deletions git-send-email.perl
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ sub format_2822_time {
sub cleanup_compose_files();

# Variables we fill in automatically, or via prompting:
my (@to,$no_to,@cc,$no_cc,@initial_cc,@bcclist,$no_bcc,@xh,
my (@to,$no_to,@initial_to,@cc,$no_cc,@initial_cc,@bcclist,$no_bcc,@xh,
$initial_reply_to,$initial_subject,@files,
$author,$sender,$smtp_authpass,$annotate,$compose,$time);

Expand Down Expand Up @@ -213,7 +213,7 @@ sub do_edit {
"smtpuser" => \$smtp_authuser,
"smtppass" => \$smtp_authpass,
"smtpdomain" => \$smtp_domain,
"to" => \@to,
"to" => \@initial_to,
"cc" => \@initial_cc,
"cccmd" => \$cc_cmd,
"aliasfiletype" => \$aliasfiletype,
Expand Down Expand Up @@ -271,7 +271,7 @@ sub signal_handler {
my $rc = GetOptions("sender|from=s" => \$sender,
"in-reply-to=s" => \$initial_reply_to,
"subject=s" => \$initial_subject,
"to=s" => \@to,
"to=s" => \@initial_to,
"no-to" => \$no_to,
"cc=s" => \@initial_cc,
"no-cc" => \$no_cc,
Expand Down Expand Up @@ -409,7 +409,7 @@ sub read_config {

# Verify the user input

foreach my $entry (@to) {
foreach my $entry (@initial_to) {
die "Comma in --to entry: $entry'\n" unless $entry !~ m/,/;
}

Expand Down Expand Up @@ -711,9 +711,9 @@ ($)
$prompting++;
}

if (!@to) {
if (!@initial_to) {
my $to = ask("Who should the emails be sent to? ");
push @to, parse_address_line($to) if defined $to; # sanitized/validated later
push @initial_to, parse_address_line($to) if defined $to; # sanitized/validated later
$prompting++;
}

Expand All @@ -731,8 +731,8 @@ sub expand_one_alias {
return $aliases{$alias} ? expand_aliases(@{$aliases{$alias}}) : $alias;
}

@to = expand_aliases(@to);
@to = (map { sanitize_address($_) } @to);
@initial_to = expand_aliases(@initial_to);
@initial_to = (map { sanitize_address($_) } @initial_to);
@initial_cc = expand_aliases(@initial_cc);
@bcclist = expand_aliases(@bcclist);

Expand Down Expand Up @@ -1136,6 +1136,7 @@ sub send_message {
my $author_encoding;
my $has_content_type;
my $body_encoding;
@to = ();
@cc = ();
@xh = ();
my $input_format = undef;
Expand Down Expand Up @@ -1300,6 +1301,7 @@ sub send_message {
($confirm =~ /^(?:auto|compose)$/ && $compose && $message_num == 1));
$needs_confirm = "inform" if ($needs_confirm && $confirm_unconfigured && @cc);

@to = (@initial_to, @to);
@cc = (@initial_cc, @cc);

my $message_was_sent = send_message();
Expand Down
15 changes: 15 additions & 0 deletions t/t9001-send-email.sh
Original file line number Diff line number Diff line change
Expand Up @@ -971,6 +971,21 @@ test_expect_success $PREREQ 'patches To headers are appended to' '
grep "RCPT TO:<nobody@example.com>" stdout
'

test_expect_success $PREREQ 'To headers from files reset each patch' '
patch1=`git format-patch -1 --to="bodies@example.com"` &&
patch2=`git format-patch -1 --to="other@example.com" HEAD~` &&
test_when_finished "rm $patch1 && rm $patch2" &&
git send-email \
--dry-run \
--from="Example <nobody@example.com>" \
--to="nobody@example.com" \
--smtp-server relay.example.com \
$patch1 $patch2 >stdout &&
test $(grep -c "RCPT TO:<bodies@example.com>" stdout) = 1 &&
test $(grep -c "RCPT TO:<nobody@example.com>" stdout) = 2 &&
test $(grep -c "RCPT TO:<other@example.com>" stdout) = 1
'

test_expect_success $PREREQ 'setup expect' '
cat >email-using-8bit <<EOF
From fe6ecc66ece37198fe5db91fa2fc41d9f4fe5cc4 Mon Sep 17 00:00:00 2001
Expand Down

0 comments on commit 3c3bb51

Please sign in to comment.