diff options
author | Matt Kraai <kraai@debian.org> | 2001-04-18 14:49:55 +0000 |
---|---|---|
committer | Matt Kraai <kraai@debian.org> | 2001-04-18 14:49:55 +0000 |
commit | b181056e06974e72f210189bf758d76dc2ecdde6 (patch) | |
tree | 4a11033060a23ab60a11045331b21e3d144326eb | |
parent | bcfeb2ac44a468f7f7487883f418e026f8e76348 (diff) | |
download | busybox-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.c | 11 | ||||
-rw-r--r-- | archival/libunarchive/unzip.c | 11 | ||||
-rw-r--r-- | 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) | |||
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 */ |