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

Re: infinite loop in git-send-email with alias files

From
Jeff King <peff@peff.net>
Date
Jul 23, 2009, 11:09 UTC
Message-ID
<20090723110928.GC4247@coredump.intra.peff.net>
In-Reply-To
<8bd0f97a0907161810w22726ffdye5c8d64719b77b53@mail.gmail.com>
On Thu, Jul 16, 2009 at 09:10:00PM -0400, Mike Frysinger wrote:
> i was setting up an aliasesfile for git-send-email, but in doing so, i
> inadvertently made a typo creating an infinite loop.  i didnt notice
> right away, but i did notice when `git-send-email` hung using 100% of
> a cpu.

Yep, we don't do cycle detection on alias expansion. It is easy enough to do, though:

-- >8 --
Subject: [PATCH] send-email: detect cycles in alias expansion
With the previous code, an alias cycle like:
  $ echo 'alias a b' >aliases
  $ echo 'alias b a' >aliases
  $ git config sendemail.aliasesfile aliases
  $ git config sendemail.aliasfiletype mutt

would put send-email into an infinite loop. This patch detects the situation and complains to the user.

Signed-off-by: Jeff King <peff@peff.net>
---
Two notes on this patch:
  1. I ended up rewriting the iterative expansion as a recursive
     function, because it makes the code simpler (doing proper detection
     in the iterative loop means you have to check where each expansion
     came from. That is, expanding "a" to "b" and "c" to "b" is OK, but
     expanding "a" to "b" to "c" is not. So you end up having to
     implement a stack, anyway. Much easier to let perl do it for us).
     But this also raises the likelihood that I screwed something up, so
     I would appreciate an extra set of eyes.
  2. It just barfs. I figure such a situation is a sign of a problem
     that the user should address. But we could also just stop expansion
     (so "a" => "b" => "a" simply expands to "a"); this is more like how
     bash aliases work, but I don't know if there is any benefit to that
     here.
     We could also print out the cycle, but I doubt it is worth the
     trouble.
 git-send-email.perl |   18 +++++++++++-------
 1 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/git-send-email.perl b/git-send-email.perl
index 8ce6f1f..d508f83 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -654,13 +654,17 @@ if (!@to) {
 }
 
 sub expand_aliases {
-	my @cur = @_;
-	my @last;
-	do {
-		@last = @cur;
-		@cur = map { $aliases{$_} ? @{$aliases{$_}} : $_ } @last;
-	} while (join(',',@cur) ne join(',',@last));
-	return @cur;
+	return map { expand_one_alias($_) } @_;
+}
+
+my %EXPANDED_ALIASES;
+sub expand_one_alias {
+	my $alias = shift;
+	if ($EXPANDED_ALIASES{$alias}) {
+		die "fatal: alias '$alias' expands to itself\n";
+	}
+	local $EXPANDED_ALIASES{$alias} = 1;
+	return $aliases{$alias} ? expand_aliases(@{$aliases{$alias}}) : $alias;
 }
 
 @to = expand_aliases(@to);
-- 
1.6.4.rc1.190.g0a8d.dirty
Previous: Mike FrysingerNext: Johannes Sixt
Message 2 of 4 in “infinite loop in git-send-email with alias files”
  1. Mike FrysingerJul 17, 2009
  2. Jeff KingJul 23, 2009
  3. Johannes SixtJul 23, 2009
  4. Jeff KingJul 23, 2009

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.