From: "Shawn O. Pearce" <spearce@spearce.org>
To: Andy Isaacson <adi@hexapodia.org>, Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Nicolas Pitre <nico@fluxnic.net>
Subject: Re: git hang with corrupted .pack
Date: Wed, 14 Oct 2009 07:23:51 -0700 [thread overview]
Message-ID: <20091014142351.GI9261@spearce.org> (raw)
In-Reply-To: <20091014042249.GA5250@hexapodia.org>
Andy Isaacson <adi@hexapodia.org> wrote:
> We're looping in unpack_compressed_entry, adding a fprintf immediately
> after the call to git_inflate() shows:
Thanks, that was really quite helpful. Junio/Nico, I think we can
just apply this patch to maint and include it in the next release:
--8<--
[PATCH] sha1_file: Fix infinite loop when pack is corrupted
Some types of corruption to a pack may confuse the deflate stream
which stores an object. In Andy's reported case a 36 byte region
of the pack was overwritten, leading to what appeared to be a valid
deflate stream that was trying to produce a result larger than our
allocated output buffer could accept.
Z_BUF_ERROR is returned from inflate() if either the input buffer
needs more input bytes, or the output buffer has run out of space.
Previously we only considered the former case, as it meant we needed
to move the stream's input buffer to the next window in the pack.
We now abort the loop if inflate() returns Z_BUF_ERROR without
consuming the entire input buffer it was given, or has filled
the entire output buffer but has not yet returned Z_STREAM_END.
Either state is a clear indicator that this loop is not working
as expected, and should not continue.
This problem cannot occur with loose objects as we open the entire
loose object as a single buffer and treat Z_BUF_ERROR as an error.
Reported-by: Andy Isaacson <adi@hexapodia.org>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
sha1_file.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/sha1_file.c b/sha1_file.c
index 4ea0b18..4cc8939 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -1357,6 +1357,8 @@ unsigned long get_size_from_delta(struct packed_git *p,
in = use_pack(p, w_curs, curpos, &stream.avail_in);
stream.next_in = in;
st = git_inflate(&stream, Z_FINISH);
+ if (st == Z_BUF_ERROR && (stream.avail_in || !stream.avail_out))
+ break;
curpos += stream.next_in - in;
} while ((st == Z_OK || st == Z_BUF_ERROR) &&
stream.total_out < sizeof(delta_head));
@@ -1594,6 +1596,8 @@ static void *unpack_compressed_entry(struct packed_git *p,
in = use_pack(p, w_curs, curpos, &stream.avail_in);
stream.next_in = in;
st = git_inflate(&stream, Z_FINISH);
+ if (st == Z_BUF_ERROR && (stream.avail_in || !stream.avail_out))
+ break;
curpos += stream.next_in - in;
} while (st == Z_OK || st == Z_BUF_ERROR);
git_inflate_end(&stream);
--
1.6.5.52.g0ff2e
--
Shawn.
next prev parent reply other threads:[~2009-10-14 14:35 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-14 4:22 git hang with corrupted .pack Andy Isaacson
2009-10-14 14:23 ` Shawn O. Pearce [this message]
2009-10-14 16:09 ` Nicolas Pitre
2009-10-14 16:12 ` Shawn O. Pearce
2009-10-14 16:42 ` Nicolas Pitre
2009-10-14 18:03 ` Shawn O. Pearce
2009-10-14 18:39 ` Nicolas Pitre
2009-10-15 7:39 ` Junio C Hamano
2009-10-20 15:14 ` Alex Riesen
2009-10-20 15:23 ` Sverre Rabbelier
2009-10-20 15:36 ` Alex Riesen
2009-10-26 2:35 ` Junio C Hamano
2009-10-26 7:07 ` Alex Riesen
2009-10-26 14:23 ` Shawn O. Pearce
2009-11-03 21:31 ` Pascal Obry
2009-11-03 22:28 ` Shawn O. Pearce
2009-11-03 22:34 ` Pascal Obry
2009-10-20 16:52 ` Junio C Hamano
2009-10-20 17:13 ` Junio C Hamano
2009-10-20 19:33 ` Junio C Hamano
2009-10-20 19:46 ` Nicolas Pitre
2009-10-20 20:50 ` Junio C Hamano
2009-10-22 6:06 ` Junio C Hamano
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=20091014142351.GI9261@spearce.org \
--to=spearce@spearce.org \
--cc=adi@hexapodia.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=nico@fluxnic.net \
/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).