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

Re: [PATCH] send-email: move process_address_list earlier to avoid, uninitialized address error

From
Jeff King <peff@peff.net>
Date
Oct 20, 2023, 07:14 UTC
Message-ID
<20231020071402.GC1642714@coredump.intra.peff.net>
In-Reply-To
<20231020064525.GB1642714@coredump.intra.peff.net>
On Fri, Oct 20, 2023 at 02:45:25AM -0400, Jeff King wrote:
Show 10 quoted lines
> > I have been looking into handling the interactive input cases while
> > solving this issue, but have yet to make a breakthrough.  Simply
> > moving the validation code below the original process_address_list
> > code results in a a scenario where I get the email address being seen
> > as something like "ARRAY (0x55ddb951d768)" rather than the email
> > address I wrote in the compose buffer.
> 
> Sounds like something is making a perl ref that shouldn't (or something
> that should be dereferencing it not doing so). If you post your patch
> and a reproduction command, I might be able to help debug.
Ah, your "address I wrote in the compose buffer" was the clue I needed.
I think this is actually an existing bug. If I use --compose and write:
  To: foo@example.com

in the editor, we read that back in and handle it in parse_header_line() like:

        my $addr_pat = join "|", qw(To Cc Bcc);
        foreach (split(/\n/, $lines)) {
                if (/^($addr_pat):\s*(.+)$/i) {
                        $parsed_line->{$1} = [ parse_address_line($2) ];
                } elsif (/^([^:]*):\s*(.+)\s*$/i) {
                        $parsed_line->{$1} = $2;
                }
        }

and there's your perl array ref (from the square brackets, which are necessary because we're sticking it in a hash value). But even before your patch, this seems to end up as garbage. The code which reads $parsed_line does not dereference the array.

The patch to fix it is only a few lines (well, more than that with some light editorializing in the comments):

diff --git a/git-send-email.perl b/git-send-email.perl
index 76589c7827..46a30088c9 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -918,7 +918,28 @@ sub get_patch_subject {
 	# Preserve unknown headers
 	foreach my $key (keys %parsed_email) {
 		next if $key eq 'body';
-		print $c2 "$key: $parsed_email{$key}";
+
+		# it seems like it would be easier to just look for
+		# $parsed_email{'To'} and so on. But we actually match
+		# these case-insenstively and preserve the user's spelling, so
+		# we might see $parsed_email{'to'}. Of course, the same bug
+		# exists for Subject, etc, above. Anyway, a "/i" regex here
+		# handles all cases.
+		#
+		# It kind of feels like all of this code would be much simpler
+		# if we just handled all of the headers while reading back the
+		# input, rather than stuffing them all into $parsed_email and
+		# then picking them out of it.
+		#
+		# It also really feels like these to/cc/bcc lines should be
+		# added to the regular ones? It is silly to make a cover letter
+		# that goes to some addresses, and then not send the patches to
+		# them, too.
+		if ($key =~ /^(To|Cc|Bcc)$/i) {
+			print $c2 "$key: ", join(', ', @{$parsed_email{$key}});
+		} else {
+			print $c2 "$key: $parsed_email{$key}";
+		}
 	}
 
 	if ($parsed_email{'body'}) {

I don't really think your patch makes things worse here. But it is
probably worth fixing it while we are here.

-Peff
Previous: Jeff KingNext: Jeff King
Message 17 of 47 in “[REGRESSION] uninitialized value $address in git send-email when given multiple recipients separated by commas”
  1. Bagas SanjayaSep 22, 2023
  2. Jeff KingSep 24, 2023
  3. Bagas SanjayaSep 25, 2023
  4. Jeff KingSep 25, 2023
  5. Todd ZullingerSep 25, 2023
  6. Jeff KingSep 25, 2023
  7. Bagas SanjayaOct 11, 2023
  8. Michael StrawbridgeOct 11, 2023
  9. send-email: move process_address_list earlier to avoid, uninitialized address errorMichael Strawbridge, Oct 11, 2023
  10. Michael StrawbridgeOct 11, 2023
  11. Junio C HamanoOct 11, 2023
  12. Jeff KingOct 11, 2023
  13. Junio C HamanoOct 11, 2023
  14. Jeff KingOct 11, 2023
  15. Michael StrawbridgeOct 13, 2023
  16. Jeff KingOct 20, 2023
  17. Jeff KingOct 20, 2023
  18. 0/3 some send-email --compose fixesJeff King, Oct 20, 2023
  19. 1/3 doc/send-email: mention handling of "reply-to" with --composeJeff King, Oct 20, 2023
  20. 2/3 Revert "send-email: extract email-parsing code into a subroutine"Jeff King, Oct 20, 2023
  21. Oswald BuddenhagenOct 20, 2023
  22. Jeff KingOct 23, 2023
  23. Oswald BuddenhagenOct 23, 2023
  24. Jeff KingOct 25, 2023
  25. Oswald BuddenhagenOct 25, 2023
  26. Junio C HamanoOct 27, 2023
  27. Jeff KingOct 30, 2023
  28. Junio C HamanoOct 20, 2023
  29. Jeff KingOct 23, 2023
  30. 3/3 send-email: handle to/cc/bcc from --compose messageJeff King, Oct 20, 2023
  31. Eric SunshineOct 20, 2023
  32. Junio C HamanoOct 20, 2023
  33. Jeff KingOct 23, 2023
  34. Michael StrawbridgeOct 24, 2023
  35. send-email: move validation code below process_address_listMichael Strawbridge, Oct 24, 2023
  36. Junio C HamanoOct 24, 2023
  37. Junio C HamanoOct 24, 2023
  38. Michael StrawbridgeOct 25, 2023
  39. send-email: move validation code below process_address_listMichael Strawbridge, Oct 25, 2023
  40. Junio C HamanoOct 26, 2023
  41. Michael StrawbridgeOct 26, 2023
  42. Jeff KingOct 25, 2023
  43. Michael StrawbridgeOct 25, 2023
  44. Uwe Kleine-KönigOct 25, 2023
  45. Junio C HamanoOct 27, 2023
  46. Bagas SanjayaOct 20, 2023
  47. Bagas SanjayaSep 26, 2023

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.