From: Tim Kientzle Date: Tue, 3 Feb 2009 18:21:12 +0000 (-0500) Subject: GCC on 64-bit Linux has 32-bit int and 64-bit size_t; not X-Git-Tag: v2.7.0~354 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cf67ef631e1e1dbf27b6f758e0534b9e9c0ff3fa;p=thirdparty%2Flibarchive.git GCC on 64-bit Linux has 32-bit int and 64-bit size_t; not taking this into account led to a stack overwrite that broke most of the new decompression code on this platform. SVN-Revision: 539 --- diff --git a/libarchive/archive_read_support_compression_bzip2.c b/libarchive/archive_read_support_compression_bzip2.c index 366285212..1504ae9cb 100644 --- a/libarchive/archive_read_support_compression_bzip2.c +++ b/libarchive/archive_read_support_compression_bzip2.c @@ -106,7 +106,7 @@ static int bzip2_reader_bid(struct archive_read_filter_bidder *self, struct archive_read_filter *filter) { const unsigned char *buffer; - size_t avail; + ssize_t avail; int bits_checked; (void)self; /* UNUSED */ @@ -201,7 +201,7 @@ bzip2_filter_read(struct archive_read_filter *self, const void **p) struct private_data *state; size_t read_avail, decompressed; unsigned char *read_buf; - int ret; + ssize_t ret; state = (struct private_data *)self->data; read_avail = 0; diff --git a/libarchive/archive_read_support_compression_compress.c b/libarchive/archive_read_support_compression_compress.c index 2fe037d15..f6c15795e 100644 --- a/libarchive/archive_read_support_compression_compress.c +++ b/libarchive/archive_read_support_compression_compress.c @@ -169,7 +169,7 @@ compress_bidder_bid(struct archive_read_filter_bidder *self, struct archive_read_filter *filter) { const unsigned char *buffer; - size_t avail; + ssize_t avail; int bits_checked; (void)self; /* UNUSED */ @@ -411,7 +411,8 @@ static int getbits(struct archive_read_filter *self, int n) { struct private_data *state = (struct private_data *)self->data; - int code, ret; + int code; + ssize_t ret; static const int mask[] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff, 0xffff diff --git a/libarchive/archive_read_support_compression_gzip.c b/libarchive/archive_read_support_compression_gzip.c index 3700bedf2..96b129e3a 100644 --- a/libarchive/archive_read_support_compression_gzip.c +++ b/libarchive/archive_read_support_compression_gzip.c @@ -112,7 +112,7 @@ gzip_bidder_bid(struct archive_read_filter_bidder *self, struct archive_read_filter *filter) { const unsigned char *buffer; - size_t avail; + ssize_t avail; int bits_checked; (void)self; /* UNUSED */ @@ -349,7 +349,7 @@ gzip_filter_read(struct archive_read_filter *self, const void **p) struct private_data *state; size_t read_avail, decompressed; const void *read_buf; - int ret; + ssize_t ret; state = (struct private_data *)self->data; read_avail = 0; diff --git a/libarchive/archive_read_support_compression_lzma.c b/libarchive/archive_read_support_compression_lzma.c index 7b91d71d0..9a939020f 100644 --- a/libarchive/archive_read_support_compression_lzma.c +++ b/libarchive/archive_read_support_compression_lzma.c @@ -117,7 +117,7 @@ lzma_bidder_bid(struct archive_read_filter_bidder *self, struct archive_read_filter *filter) { const unsigned char *buffer; - size_t avail; + ssize_t avail; int bits_checked; (void)self; /* UNUSED */ @@ -186,7 +186,7 @@ lzma_bidder_init(struct archive_read_filter *self) void *out_block; const char *buff; struct private_data *state; - int ret; + ssize_t ret; self->code = ARCHIVE_COMPRESSION_LZMA; self->name = "lzma"; @@ -267,7 +267,7 @@ lzma_filter_read(struct archive_read_filter *self, const void **p) struct private_data *state; size_t read_avail, decompressed; const void *read_buf; - int ret; + ssize_t ret; state = (struct private_data *)self->data; read_avail = 0; diff --git a/libarchive/archive_read_support_compression_xz.c b/libarchive/archive_read_support_compression_xz.c index 60a31ed51..7ac7a8c3a 100644 --- a/libarchive/archive_read_support_compression_xz.c +++ b/libarchive/archive_read_support_compression_xz.c @@ -133,7 +133,7 @@ xz_bidder_bid(struct archive_read_filter_bidder *self, struct archive_read_filter *filter) { const unsigned char *buffer; - size_t avail; + ssize_t avail; int bits_checked; (void)self; /* UNUSED */ diff --git a/libarchive/archive_read_support_format_cpio.c b/libarchive/archive_read_support_format_cpio.c index 622bb6793..56247dd1c 100644 --- a/libarchive/archive_read_support_format_cpio.c +++ b/libarchive/archive_read_support_format_cpio.c @@ -331,7 +331,8 @@ find_newc_header(struct archive_read *a) { const void *h; const char *p, *q; - size_t skip, bytes, skipped = 0; + size_t skip, skipped = 0; + ssize_t bytes; for (;;) { h = __archive_read_ahead(a, sizeof(struct cpio_newc_header), &bytes); @@ -465,7 +466,8 @@ find_odc_header(struct archive_read *a) { const void *h; const char *p, *q; - size_t skip, bytes, skipped = 0; + size_t skip, skipped = 0; + ssize_t bytes; for (;;) { h = __archive_read_ahead(a, sizeof(struct cpio_odc_header), &bytes);