git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/5] git-send-email: remove invalid addresses earlier

From
KMKrzysztof Mazur <krzysiek@podlesie.net>
Date
Nov 22, 2012, 18:12 UTC
Message-ID
<1353607932-10436-3-git-send-email-krzysiek@podlesie.net>
In-Reply-To
<1353607932-10436-1-git-send-email-krzysiek@podlesie.net>

Some addresses are passed twice to unique_email_list() and invalid addresses may be reported twice per send_message. Now we warn about them earlier and we also remove invalid addresses.

This also removes using of undefined values for string comparison for invalid addresses in cc list processing.

Signed-off-by: Krzysztof Mazur <krzysiek@podlesie.net>
---
 git-send-email.perl | 52 +++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 39 insertions(+), 13 deletions(-)
diff --git a/git-send-email.perl b/git-send-email.perl
index 356f99d..5056fdc 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -786,9 +786,11 @@ sub expand_one_alias {
 }
 
 @initial_to = expand_aliases(@initial_to);
-@initial_to = (map { sanitize_address($_) } @initial_to);
+@initial_to = validate_address_list(sanitize_address_list(@initial_to));
 @initial_cc = expand_aliases(@initial_cc);
+@initial_cc = validate_address_list(sanitize_address_list(@initial_cc));
 @bcclist = expand_aliases(@bcclist);
+@bcclist = validate_address_list(sanitize_address_list(@bcclist));
 
 if ($thread && !defined $initial_reply_to && $prompting) {
 	$initial_reply_to = ask(
@@ -839,6 +841,28 @@ sub extract_valid_address {
 	return undef;
 }
 
+sub extract_valid_address_or_die {
+	my $address = shift;
+	$address = extract_valid_address($address);
+	die "error: unable to extract a valid address from: $address\n"
+		if !$address;
+	return $address;
+}
+
+sub validate_address {
+	my $address = shift;
+	if (!extract_valid_address($address)) {
+		print STDERR "W: unable to extract a valid address from: $address\n";
+		return undef;
+	}
+	return $address;
+}
+
+sub validate_address_list {
+	return (grep { defined $_ }
+		map { validate_address($_) } @_);
+}
+
 # Usually don't need to change anything below here.
 
 # we make a "fake" message id by taking the current number
@@ -955,6 +979,10 @@ sub sanitize_address {
 
 }
 
+sub sanitize_address_list {
+	return (map { sanitize_address($_) } @_);
+}
+
 # Returns the local Fully Qualified Domain Name (FQDN) if available.
 #
 # Tightly configured MTAa require that a caller sends a real DNS
@@ -1017,14 +1045,13 @@ sub maildomain {
 
 sub send_message {
 	my @recipients = unique_email_list(@to);
-	@cc = (grep { my $cc = extract_valid_address($_);
+	@cc = (grep { my $cc = extract_valid_address_or_die($_);
 		      not grep { $cc eq $_ || $_ =~ /<\Q${cc}\E>$/ } @recipients
 		    }
-	       map { sanitize_address($_) }
 	       @cc);
 	my $to = join (",\n\t", @recipients);
 	@recipients = unique_email_list(@recipients,@cc,@bcclist);
-	@recipients = (map { extract_valid_address($_) } @recipients);
+	@recipients = (map { extract_valid_address_or_die($_) } @recipients);
 	my $date = format_2822_time($time++);
 	my $gitversion = '@@GIT_VERSION@@';
 	if ($gitversion =~ m/..GIT_VERSION../) {
@@ -1267,7 +1294,7 @@ foreach my $t (@files) {
 				foreach my $addr (parse_address_line($1)) {
 					printf("(mbox) Adding to: %s from line '%s'\n",
 						$addr, $_) unless $quiet;
-					push @to, sanitize_address($addr);
+					push @to, $addr;
 				}
 			}
 			elsif (/^Cc:\s+(.*)$/) {
@@ -1376,6 +1403,9 @@ foreach my $t (@files) {
 		($confirm =~ /^(?:auto|compose)$/ && $compose && $message_num == 1));
 	$needs_confirm = "inform" if ($needs_confirm && $confirm_unconfigured && @cc);
 
+	@to = validate_address_list(sanitize_address_list(@to));
+	@cc = validate_address_list(sanitize_address_list(@cc));
+
 	@to = (@initial_to, @to);
 	@cc = (@initial_cc, @cc);
 
@@ -1431,14 +1461,10 @@ sub unique_email_list {
 	my @emails;
 
 	foreach my $entry (@_) {
-		if (my $clean = extract_valid_address($entry)) {
-			$seen{$clean} ||= 0;
-			next if $seen{$clean}++;
-			push @emails, $entry;
-		} else {
-			print STDERR "W: unable to extract a valid address",
-					" from: $entry\n";
-		}
+		my $clean = extract_valid_address_or_die($entry))
+		$seen{$clean} ||= 0;
+		next if $seen{$clean}++;
+		push @emails, $entry;
 	}
 	return @emails;
 }
-- 
1.8.0.393.gcc9701d
Previous: Krzysztof MazurNext: Junio C Hamano
Message 22 of 34 in “Failure to extra stable@vger.kernel.org addresses”
  1. Felipe BalbiNov 19, 2012
  2. Krzysztof MazurNov 19, 2012
  3. Felipe BalbiNov 19, 2012
  4. Junio C HamanoNov 19, 2012
  5. Felipe ContrerasNov 19, 2012
  6. Krzysztof MazurNov 19, 2012
  7. Felipe ContrerasNov 19, 2012
  8. Junio C HamanoNov 19, 2012
  9. Krzysztof MazurNov 20, 2012
  10. Krzysztof MazurNov 20, 2012
  11. Felipe ContrerasNov 20, 2012
  12. Andreas EricssonNov 20, 2012
  13. Krzysztof MazurNov 20, 2012
  14. Andreas SchwabNov 20, 2012
  15. Krzysztof MazurNov 20, 2012
  16. Felipe ContrerasNov 20, 2012
  17. Junio C HamanoNov 20, 2012
  18. Krzysztof MazurNov 20, 2012
  19. Junio C HamanoNov 20, 2012
  20. 1/5 git-send-email: remove garbage after email addressKrzysztof Mazur, Nov 22, 2012
  21. 2/5 git-send-email: fix fallback code in extract_valid_address()Krzysztof Mazur, Nov 22, 2012
  22. 3/5 git-send-email: remove invalid addresses earlierKrzysztof Mazur, Nov 22, 2012
  23. Junio C HamanoNov 26, 2012
  24. 4/5 git-send-email: ask what to do with an invalid email addressKrzysztof Mazur, Nov 22, 2012
  25. 5/5 git-send-email: allow edit invalid email addressKrzysztof Mazur, Nov 22, 2012
  26. Junio C HamanoNov 26, 2012
  27. Krzysztof MazurNov 26, 2012
  28. Junio C HamanoNov 26, 2012
  29. Krzysztof MazurNov 26, 2012
  30. Junio C HamanoNov 26, 2012
  31. Krzysztof MazurNov 27, 2012
  32. Junio C HamanoNov 20, 2012
  33. Krzysztof MazurNov 20, 2012
  34. Felipe BalbiNov 20, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.