From: David Abrahams <dave@boostpro.com>
To: Jeff King <peff@peff.net>
Cc: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org
Subject: Re: "malloc failed"
Date: Thu, 29 Jan 2009 08:10:05 -0500 [thread overview]
Message-ID: <87pri6qmvm.fsf@mcbain.luannocracy.com> (raw)
In-Reply-To: <20090129055633.GA32609@coredump.intra.peff.net> (Jeff King's message of "Thu, 29 Jan 2009 00:56:34 -0500")
on Thu Jan 29 2009, Jeff King <peff-AT-peff.net> wrote:
> On Thu, Jan 29, 2009 at 12:20:41AM -0500, Jeff King wrote:
>
>> Ok, that _is_ big. ;) I wouldn't be surprised if there is some corner of
>> the code that barfs on a single object that doesn't fit in a signed
>> 32-bit integer; I don't think we have any test coverage for stuff that
>> big.
>
> Sure enough, that is the problem. With the patch below I was able to
> "git add" and commit a 3 gigabyte file of random bytes (so even the
> deflated object was 3G).
>
> I think it might be worth applying as a general cleanup, but I have no
> idea if other parts of the system might barf on such an object.
>
> -- >8 --
> Subject: [PATCH] avoid 31-bit truncation in write_loose_object
>
> The size of the content we are adding may be larger than
> 2.1G (i.e., "git add gigantic-file"). Most of the code-path
> to do so uses size_t or unsigned long to record the size,
> but write_loose_object uses a signed int.
>
> On platforms where "int" is 32-bits (which includes x86_64
> Linux platforms), we end up passing malloc a negative size.
Good work. I don't know if this matters to you, but I think on a 32-bit
platform you'll find that size_t, which is supposed to be able to hold
the size of the largest representable *memory block*, is only 4 bytes
large:
#include <limits.h>
#include <stdio.h>
int main()
{
printf("sizeof(size_t) = %d", sizeof(size_t));
}
Prints "sizeof(size_t) = 4" on my core duo.
> Signed-off-by: Jeff King <peff@peff.net>
> ---
> sha1_file.c | 3 ++-
> 1 files changed, 2 insertions(+), 1 deletions(-)
>
> diff --git a/sha1_file.c b/sha1_file.c
> index 360f7e5..8868b80 100644
> --- a/sha1_file.c
> +++ b/sha1_file.c
> @@ -2340,7 +2340,8 @@ static int create_tmpfile(char *buffer, size_t bufsiz, const
> char *filename)
> static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen,
> void *buf, unsigned long len, time_t mtime)
> {
> - int fd, size, ret;
> + int fd, ret;
> + size_t size;
> unsigned char *compressed;
> z_stream stream;
> char *filename;
--
Dave Abrahams
BoostPro Computing
http://www.boostpro.com
next prev parent reply other threads:[~2009-01-29 13:11 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-27 15:04 "malloc failed" David Abrahams
2009-01-27 15:29 ` Shawn O. Pearce
2009-01-27 15:32 ` David Abrahams
2009-01-27 18:02 ` Johannes Schindelin
2009-01-28 5:02 ` Jeff King
2009-01-28 21:53 ` David Abrahams
2009-01-29 0:06 ` David Abrahams
2009-01-29 5:20 ` Jeff King
2009-01-29 5:56 ` Jeff King
2009-01-29 7:53 ` Junio C Hamano
2009-01-29 13:10 ` David Abrahams [this message]
2009-01-29 13:41 ` Andreas Ericsson
2009-01-30 4:49 ` Jeff King
2009-01-28 22:16 ` Pau Garcia i Quiles
2009-01-29 5: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=87pri6qmvm.fsf@mcbain.luannocracy.com \
--to=dave@boostpro.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.