diff options
| author | Tim Kientzle <kientzle@FreeBSD.org> | 2007-04-05 05:18:16 +0000 |
|---|---|---|
| committer | Tim Kientzle <kientzle@FreeBSD.org> | 2007-04-05 05:18:16 +0000 |
| commit | 72654d08e1b3d0b8ab07949dff880c4ce494d452 (patch) | |
| tree | d2f3a4d09ef261b5cccfa37f06374220c7b202fd /lib/libarchive/archive_read_support_compression_bzip2.c | |
| parent | e44ad922b46bdde264868a3b881f3aa1fa24a51f (diff) | |
Notes
Diffstat (limited to 'lib/libarchive/archive_read_support_compression_bzip2.c')
| -rw-r--r-- | lib/libarchive/archive_read_support_compression_bzip2.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/lib/libarchive/archive_read_support_compression_bzip2.c b/lib/libarchive/archive_read_support_compression_bzip2.c index 9feb935852143..71fd4bb69aedc 100644 --- a/lib/libarchive/archive_read_support_compression_bzip2.c +++ b/lib/libarchive/archive_read_support_compression_bzip2.c @@ -253,10 +253,10 @@ static ssize_t read_ahead(struct archive_read *a, const void **p, size_t min) { struct private_data *state; - int read_avail, was_avail, ret; + size_t read_avail, was_avail; + int ret; state = (struct private_data *)a->compression_data; - was_avail = -1; if (!a->client_reader) { archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER, "No read callback is registered? " @@ -275,13 +275,14 @@ read_ahead(struct archive_read *a, const void **p, size_t min) = state->uncompressed_buffer_size - read_avail; } - while (was_avail < read_avail && /* Made some progress. */ - read_avail < (int)min && /* Haven't satisfied min. */ - read_avail < (int)state->uncompressed_buffer_size) { /* !full */ + while (read_avail < min && /* Haven't satisfied min. */ + read_avail < state->uncompressed_buffer_size) { /* !full */ + was_avail = read_avail; if ((ret = drive_decompressor(a, state)) != ARCHIVE_OK) return (ret); - was_avail = read_avail; read_avail = state->stream.next_out - state->read_next; + if (was_avail == read_avail) /* No progress? */ + break; } *p = state->read_next; @@ -346,12 +347,15 @@ drive_decompressor(struct archive_read *a, struct private_data *state) ssize_t ret; int decompressed, total_decompressed; char *output; + const void *read_buf; total_decompressed = 0; for (;;) { if (state->stream.avail_in == 0) { + read_buf = state->stream.next_in; ret = (a->client_reader)(&a->archive, a->client_data, - (const void **)&state->stream.next_in); + &read_buf); + state->stream.next_in = (void *)(uintptr_t)read_buf; if (ret < 0) { /* * TODO: Find a better way to handle |
