]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
correct a mismatch- you tell libarchive something is consumed only after you've actua...
authorBrian Harring <ferringb@gmail.com>
Thu, 23 Sep 2010 10:21:09 +0000 (06:21 -0400)
committerBrian Harring <ferringb@gmail.com>
Thu, 23 Sep 2010 10:21:09 +0000 (06:21 -0400)
SVN-Revision: 2687

libarchive/archive_read_support_compression_compress.c

index 2461975e59bc20954905e4225d7e939c5de5dda4..72125d6b171c20690ac124a26f802761942579a8 100644 (file)
@@ -95,6 +95,7 @@ struct private_data {
        /* Input variables. */
        const unsigned char     *next_in;
        size_t                   avail_in;
+       size_t                   consume_unnotified;
        int                      bit_buffer;
        int                      bits_avail;
        size_t                   bytes_in_section;
@@ -420,6 +421,11 @@ getbits(struct archive_read_filter *self, int n)
 
        while (state->bits_avail < n) {
                if (state->avail_in <= 0) {
+                       if (state->consume_unnotified) {
+                               __archive_read_filter_consume(self->upstream,
+                                       state->consume_unnotified);
+                               state->consume_unnotified = 0;
+                       }
                        state->next_in
                            = __archive_read_filter_ahead(self->upstream,
                                1, &ret);
@@ -427,8 +433,7 @@ getbits(struct archive_read_filter *self, int n)
                                return (-1);
                        if (ret < 0 || state->next_in == NULL)
                                return (ARCHIVE_FATAL);
-                       state->avail_in = ret;
-                       __archive_read_filter_consume(self->upstream, ret);
+                       state->consume_unnotified = state->avail_in = ret;
                }
                state->bit_buffer |= *state->next_in++ << state->bits_avail;
                state->avail_in--;