Corrected buffer overflow during automatic checkpoint in fast-import.

If we previously were using a delta but we needed to checkpoint the
current packfile and switch to a new packfile we need to throw away
the delta and compress the raw object by itself, as delta chains
cannot span non-thin packfiles.  Unfortunately the output buffer
in this case needs to grow, as the size of the compressed object
may be quite a bit larger than the size of the compressed delta.

I've also avoided recompressing the object if we are checkpointing
and we didn't use a delta.  In this case the output buffer is the
correct size and has already been populated with the right data,
we just need to close out the current packfile and open a new one.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Shawn O. Pearce 2007-01-15 23:40:27 -05:00
Родитель 9d1b1b5ed7
Коммит 5d6f3ef641
1 изменённых файлов: 10 добавлений и 9 удалений

Просмотреть файл

@ -847,16 +847,17 @@ static int store_object(
if (delta) {
free(delta);
delta = NULL;
memset(&s, 0, sizeof(s));
deflateInit(&s, zlib_compression_level);
s.next_in = dat;
s.avail_in = datlen;
s.avail_out = deflateBound(&s, s.avail_in);
s.next_out = out = xrealloc(out, s.avail_out);
while (deflate(&s, Z_FINISH) == Z_OK)
/* nothing */;
deflateEnd(&s);
}
memset(&s, 0, sizeof(s));
deflateInit(&s, zlib_compression_level);
s.next_in = dat;
s.avail_in = datlen;
s.avail_out = deflateBound(&s, s.avail_in);
s.next_out = out;
while (deflate(&s, Z_FINISH) == Z_OK)
/* nothing */;
deflateEnd(&s);
}
e->type = type;