aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Kraai <kraai@debian.org>2001-04-18 14:49:55 +0000
committerMatt Kraai <kraai@debian.org>2001-04-18 14:49:55 +0000
commitb181056e06974e72f210189bf758d76dc2ecdde6 (patch)
tree4a11033060a23ab60a11045331b21e3d144326eb
parentbcfeb2ac44a468f7f7487883f418e026f8e76348 (diff)
downloadbusybox-w32-b181056e06974e72f210189bf758d76dc2ecdde6.tar.gz
busybox-w32-b181056e06974e72f210189bf758d76dc2ecdde6.tar.bz2
busybox-w32-b181056e06974e72f210189bf758d76dc2ecdde6.zip
Eliminated seeks so that we work correctly on pipes, and removed reliance on
undefined evaluation ordering. Thanks to Anthony Towns for explanation and solution.
-rw-r--r--archival/libunarchive/decompress_unzip.c11
-rw-r--r--archival/libunarchive/unzip.c11
-rw-r--r--libbb/unzip.c11
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)
904 int method; 904 int method;
905 typedef void (*sig_type) (int); 905 typedef void (*sig_type) (int);
906 int exit_code=0; /* program exit code */ 906 int exit_code=0; /* program exit code */
907 int i;
907 908
908 in_file = l_in_file; 909 in_file = l_in_file;
909 out_file = l_out_file; 910 out_file = l_out_file;
@@ -949,10 +950,16 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file)
949 flags = (unsigned char) fgetc(in_file); 950 flags = (unsigned char) fgetc(in_file);
950 951
951 /* Ignore time stamp(4), extra flags(1), OS type(1) */ 952 /* Ignore time stamp(4), extra flags(1), OS type(1) */
952 fseek(in_file, 6, SEEK_CUR); 953 for (i = 0; i < 6; i++)
954 fgetc(in_file);
953 955
954 if ((flags & extra_field) != 0) { 956 if ((flags & extra_field) != 0) {
955 fseek(in_file, (size_t) fgetc(in_file) + ((size_t)fgetc(in_file) << 8), SEEK_CUR); 957 size_t extra;
958 extra = fgetc(in_file);
959 extra += fgetc(in_file) << 8;
960
961 for (i = 0; i < extra; i++)
962 fgetc(in_file);
956 } 963 }
957 964
958 /* Discard original name if any */ 965 /* 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)
904 int method; 904 int method;
905 typedef void (*sig_type) (int); 905 typedef void (*sig_type) (int);
906 int exit_code=0; /* program exit code */ 906 int exit_code=0; /* program exit code */
907 int i;
907 908
908 in_file = l_in_file; 909 in_file = l_in_file;
909 out_file = l_out_file; 910 out_file = l_out_file;
@@ -949,10 +950,16 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file)
949 flags = (unsigned char) fgetc(in_file); 950 flags = (unsigned char) fgetc(in_file);
950 951
951 /* Ignore time stamp(4), extra flags(1), OS type(1) */ 952 /* Ignore time stamp(4), extra flags(1), OS type(1) */
952 fseek(in_file, 6, SEEK_CUR); 953 for (i = 0; i < 6; i++)
954 fgetc(in_file);
953 955
954 if ((flags & extra_field) != 0) { 956 if ((flags & extra_field) != 0) {
955 fseek(in_file, (size_t) fgetc(in_file) + ((size_t)fgetc(in_file) << 8), SEEK_CUR); 957 size_t extra;
958 extra = fgetc(in_file);
959 extra += fgetc(in_file) << 8;
960
961 for (i = 0; i < extra; i++)
962 fgetc(in_file);
956 } 963 }
957 964
958 /* Discard original name if any */ 965 /* 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)
904 int method; 904 int method;
905 typedef void (*sig_type) (int); 905 typedef void (*sig_type) (int);
906 int exit_code=0; /* program exit code */ 906 int exit_code=0; /* program exit code */
907 int i;
907 908
908 in_file = l_in_file; 909 in_file = l_in_file;
909 out_file = l_out_file; 910 out_file = l_out_file;
@@ -949,10 +950,16 @@ extern int unzip(FILE *l_in_file, FILE *l_out_file)
949 flags = (unsigned char) fgetc(in_file); 950 flags = (unsigned char) fgetc(in_file);
950 951
951 /* Ignore time stamp(4), extra flags(1), OS type(1) */ 952 /* Ignore time stamp(4), extra flags(1), OS type(1) */
952 fseek(in_file, 6, SEEK_CUR); 953 for (i = 0; i < 6; i++)
954 fgetc(in_file);
953 955
954 if ((flags & extra_field) != 0) { 956 if ((flags & extra_field) != 0) {
955 fseek(in_file, (size_t) fgetc(in_file) + ((size_t)fgetc(in_file) << 8), SEEK_CUR); 957 size_t extra;
958 extra = fgetc(in_file);
959 extra += fgetc(in_file) << 8;
960
961 for (i = 0; i < extra; i++)
962 fgetc(in_file);
956 } 963 }
957 964
958 /* Discard original name if any */ 965 /* Discard original name if any */