Andrew's git
/
gitweb.git
/ diff
summary
|
log
|
commit
| diff |
tree
commit
grep
author
committer
pickaxe
?
re
index-pack: correct "len" type in unpack_data()
author
Nguyễn Thái Ngọc Duy
<pclouds@gmail.com>
Wed, 13 Jul 2016 15:44:00 +0000
(17:44 +0200)
committer
Junio C Hamano
<gitster@pobox.com>
Wed, 13 Jul 2016 16:14:38 +0000
(09:14 -0700)
On 32-bit systems with large file support, one entry could be larger
than 4GB and overflow "len". Correct it so we can unpack a full entry.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/index-pack.c
patch
|
blob
|
history
raw
|
patch
|
inline
| side by side (parent:
166df26
)
diff --git
a/builtin/index-pack.c
b/builtin/index-pack.c
index e8c71fc1d2e44ef9bd93c37ff714eeefc53664cf..cafaab7b138efd4d06b0878b7e72416f55ebada2 100644
(file)
--- a/
builtin/index-pack.c
+++ b/
builtin/index-pack.c
@@
-549,13
+549,13
@@
static void *unpack_data(struct object_entry *obj,
void *cb_data)
{
off_t from = obj[0].idx.offset + obj[0].hdr_size;
void *cb_data)
{
off_t from = obj[0].idx.offset + obj[0].hdr_size;
-
unsigned long
len = obj[1].idx.offset - from;
+
off_t
len = obj[1].idx.offset - from;
unsigned char *data, *inbuf;
git_zstream stream;
int status;
data = xmallocz(consume ? 64*1024 : obj->size);
unsigned char *data, *inbuf;
git_zstream stream;
int status;
data = xmallocz(consume ? 64*1024 : obj->size);
- inbuf = xmalloc((len < 64*1024) ? len : 64*1024);
+ inbuf = xmalloc((len < 64*1024) ?
(int)
len : 64*1024);
memset(&stream, 0, sizeof(stream));
git_inflate_init(&stream);
memset(&stream, 0, sizeof(stream));
git_inflate_init(&stream);
@@
-563,15
+563,15
@@
static void *unpack_data(struct object_entry *obj,
stream.avail_out = consume ? 64*1024 : obj->size;
do {
stream.avail_out = consume ? 64*1024 : obj->size;
do {
- ssize_t n = (len < 64*1024) ? len : 64*1024;
+ ssize_t n = (len < 64*1024) ?
(ssize_t)
len : 64*1024;
n = xpread(get_thread_data()->pack_fd, inbuf, n, from);
if (n < 0)
die_errno(_("cannot pread pack file"));
if (!n)
n = xpread(get_thread_data()->pack_fd, inbuf, n, from);
if (n < 0)
die_errno(_("cannot pread pack file"));
if (!n)
- die(Q_("premature end of pack file, %
lu
byte missing",
- "premature end of pack file, %
lu
bytes missing",
- len),
- len);
+ die(Q_("premature end of pack file, %
"PRIuMAX"
byte missing",
+ "premature end of pack file, %
"PRIuMAX"
bytes missing",
+
(unsigned int)
len),
+
(uintmax_t)
len);
from += n;
len -= n;
stream.next_in = inbuf;
from += n;
len -= n;
stream.next_in = inbuf;