From b181056e06974e72f210189bf758d76dc2ecdde6 Mon Sep 17 00:00:00 2001 From: Matt Kraai Date: Wed, 18 Apr 2001 14:49:55 +0000 Subject: [PATCH] Eliminated seeks so that we work correctly on pipes, and removed reliance on undefined evaluation ordering. Thanks to Anthony Towns for explanation and solution. --- archival/libunarchive/decompress_unzip.c | 11 +++++++++-- archival/libunarchive/unzip.c | 11 +++++++++-- libbb/unzip.c | 11 +++++++++-- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/archival/libunarchive/decompress_unzip.c b/archival/libunarchive/decompress_unzip.c index b843ec812..9568c2870 100644 --- a/archival/libunarchive/decompress_unzip.c +++ b/archival/libunarchive/decompress_unzip.c @@ -904,6 +904,7 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file) int method; typedef void (*sig_type) (int); int exit_code=0; /* program exit code */ + int i; in_file = l_in_file; out_file = l_out_file; @@ -949,10 +950,16 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file) flags = (unsigned char) fgetc(in_file); /* Ignore time stamp(4), extra flags(1), OS type(1) */ - fseek(in_file, 6, SEEK_CUR); + for (i = 0; i < 6; i++) + fgetc(in_file); if ((flags & extra_field) != 0) { - fseek(in_file, (size_t) fgetc(in_file) + ((size_t)fgetc(in_file) << 8), SEEK_CUR); + size_t extra; + extra = fgetc(in_file); + extra += fgetc(in_file) << 8; + + for (i = 0; i < extra; i++) + fgetc(in_file); } /* Discard original name if any */ diff --git a/archival/libunarchive/unzip.c b/archival/libunarchive/unzip.c index b843ec812..9568c2870 100644 --- a/archival/libunarchive/unzip.c +++ b/archival/libunarchive/unzip.c @@ -904,6 +904,7 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file) int method; typedef void (*sig_type) (int); int exit_code=0; /* program exit code */ + int i; in_file = l_in_file; out_file = l_out_file; @@ -949,10 +950,16 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file) flags = (unsigned char) fgetc(in_file); /* Ignore time stamp(4), extra flags(1), OS type(1) */ - fseek(in_file, 6, SEEK_CUR); + for (i = 0; i < 6; i++) + fgetc(in_file); if ((flags & extra_field) != 0) { - fseek(in_file, (size_t) fgetc(in_file) + ((size_t)fgetc(in_file) << 8), SEEK_CUR); + size_t extra; + extra = fgetc(in_file); + extra += fgetc(in_file) << 8; + + for (i = 0; i < extra; i++) + fgetc(in_file); } /* Discard original name if any */ diff --git a/libbb/unzip.c b/libbb/unzip.c index b843ec812..9568c2870 100644 --- a/libbb/unzip.c +++ b/libbb/unzip.c @@ -904,6 +904,7 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file) int method; typedef void (*sig_type) (int); int exit_code=0; /* program exit code */ + int i; in_file = l_in_file; out_file = l_out_file; @@ -949,10 +950,16 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file) flags = (unsigned char) fgetc(in_file); /* Ignore time stamp(4), extra flags(1), OS type(1) */ - fseek(in_file, 6, SEEK_CUR); + for (i = 0; i < 6; i++) + fgetc(in_file); if ((flags & extra_field) != 0) { - fseek(in_file, (size_t) fgetc(in_file) + ((size_t)fgetc(in_file) << 8), SEEK_CUR); + size_t extra; + extra = fgetc(in_file); + extra += fgetc(in_file) << 8; + + for (i = 0; i < extra; i++) + fgetc(in_file); } /* Discard original name if any */ -- 2.25.1