From: Jeff King <peff@peff.net>
To: Mike Frysinger <vapier.adi@gmail.com>
Cc: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org
Subject: Re: infinite loop in git-send-email with alias files
Date: Thu, 23 Jul 2009 07:09:29 -0400 [thread overview]
Message-ID: <20090723110928.GC4247@coredump.intra.peff.net> (raw)
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
next prev parent reply other threads:[~2009-07-23 11:09 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-07-17 1:10 infinite loop in git-send-email with alias files Mike Frysinger
2009-07-23 11:09 ` Jeff King [this message]
2009-07-23 12:30 ` Johannes Sixt
2009-07-23 13:54 ` Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090723110928.GC4247@coredump.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=vapier.adi@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).