git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Cc: git@vger.kernel.org, Stepan Kasal <kasal@ucw.cz>,
	Jean-Jacques Lafay <jeanjacques.lafay@gmail.com>
Subject: Re: [PATCH] git tag --contains : avoid stack overflow
Date: Thu, 17 Apr 2014 17:32:38 -0400	[thread overview]
Message-ID: <20140417213238.GA14792@sigill.intra.peff.net> (raw)
In-Reply-To: <alpine.DEB.1.00.1404171902010.14982@s15462909.onlinehome-server.info>

On Thu, Apr 17, 2014 at 07:31:54PM +0200, Johannes Schindelin wrote:

> > 	bash -c "ulimit -s 64 && git tag --contains HEAD" >actual &&
> [...]
> Please see https://github.com/msysgit/git/c63d196 for the fixup, and
> https://github.com/msysgit/git/compare/tag-contains%5E...tag-contains for
> the updated patch.

I tried running the test on my Linux box, but it doesn't fail with the
existing recursive code. So I tried a few different stack sizes, like:

  for i in `seq 1 64`; do
    bash -c "
      ulimit -s $i &&
      ../../git tag --contains HEAD ||
      echo fail $i"
  done

The results are strangely non-deterministic, but with -O0, we generally
die reliably below about 60. With -O2, though, it's more like 43. We
can't go _too_ low here, though, as lots of things start breaking around
32.

If we instead bump the size of the history to 2000 commits, then I
reliably fail with a 64k stack (even with -O2, it needs around 80k).

Of course those numbers are all black magic, and are going to vary based
on the system, the compiler, settings, etc. My system is 64-bit, and the
current code needs at least 3 pointers per recursive invocation. So
we're spending ~46K on those variables, not counting any calling
convention overhead (and presumably we at least need a function return
pointer there). So a 32-bit system might actually get by, as it would
need half as much.

So we can bump the depth further; probably 4000 is enough for any system
to fail with a 64k stack. The deeper we make it, the longer it takes to
run the test, though. At 4000, my machine seems to take about 300ms to
run it. That's may be OK.

-Peff

  reply	other threads:[~2014-04-17 21:32 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-16 14:15 [PATCH] git tag --contains : avoid stack overflow Stepan Kasal
2014-04-16 15:46 ` Jeff King
2014-04-17 17:31   ` Johannes Schindelin
2014-04-17 21:32     ` Jeff King [this message]
2014-04-17 21:52       ` Johannes Schindelin
2014-04-17 21:58         ` Jeff King
2014-04-23  7:53           ` [PATCH v2] " Stepan Kasal
2014-04-23 14:28             ` Johannes Schindelin
2014-04-23 15:45               ` Stepan Kasal
2014-04-23 19:12             ` Junio C Hamano
2014-04-23 19:16               ` Jeff King
2014-04-23 20:48                 ` Junio C Hamano
2014-04-23 20:55                   ` Jeff King
2014-04-23 21:05                     ` Junio C Hamano
2014-04-24 12:20                       ` Stepan Kasal
2014-04-24 12:24                         ` [PATCH v3] git tag --contains: " Stepan Kasal
2014-04-25  5:54                           ` Jeff King
2014-09-20 18:18                           ` Andreas Schwab
2014-09-23 16:05                             ` Jeff King
2014-09-23 21:48                               ` Andreas Schwab
2014-09-23 22:41                                 ` Junio C Hamano
2014-04-23 19:59               ` [PATCH v2] git tag --contains : " Stepan Kasal
2014-04-23 19:17             ` Jeff King
2014-04-23 21:14               ` Johannes Schindelin
     [not found] <1352568970-4669-1-git-send-email-jeanjacques.lafay@gmail.com>
2012-11-10 20:00 ` [PATCH] " Philip Oakley
2012-11-10 21:13   ` Jean-Jacques Lafay
2012-11-10 21:33     ` Pat Thoyts
2012-11-11 16:46     ` René Scharfe
2012-11-11 16:54       ` Jeff King
2012-11-12 22:27         ` Jean-Jacques Lafay
2012-11-12 23:14           ` 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=20140417213238.GA14792@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=jeanjacques.lafay@gmail.com \
    --cc=kasal@ucw.cz \
    /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).