diff options
author | Joakim Tjernlund <Joakim.Tjernlund@transmode.se> | 2010-02-08 18:55:15 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-02-11 23:56:48 +0100 |
commit | 0866b369003fbf81f8f35eb15360a628b3f3aa9a (patch) | |
tree | 2c1281842f3c91e822268045b57d7c9aadacdee6 | |
parent | 80f4275629bd7f73776018cb3d06773a413bbbfb (diff) | |
download | busybox-w32-0866b369003fbf81f8f35eb15360a628b3f3aa9a.tar.gz busybox-w32-0866b369003fbf81f8f35eb15360a628b3f3aa9a.tar.bz2 busybox-w32-0866b369003fbf81f8f35eb15360a628b3f3aa9a.zip |
gunzip: inflate_codes(): add fix from upstream gzip to prevent false CRC error
Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund@transmode.se>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | archival/libunarchive/decompress_unzip.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/archival/libunarchive/decompress_unzip.c b/archival/libunarchive/decompress_unzip.c index feaa047bd..33e877ec8 100644 --- a/archival/libunarchive/decompress_unzip.c +++ b/archival/libunarchive/decompress_unzip.c | |||
@@ -575,13 +575,16 @@ static NOINLINE int inflate_codes(STATE_PARAM_ONLY) | |||
575 | do { | 575 | do { |
576 | /* Was: nn -= (e = (e = GUNZIP_WSIZE - ((dd &= GUNZIP_WSIZE - 1) > w ? dd : w)) > nn ? nn : e); */ | 576 | /* Was: nn -= (e = (e = GUNZIP_WSIZE - ((dd &= GUNZIP_WSIZE - 1) > w ? dd : w)) > nn ? nn : e); */ |
577 | /* Who wrote THAT?? rewritten as: */ | 577 | /* Who wrote THAT?? rewritten as: */ |
578 | unsigned delta; | ||
579 | |||
578 | dd &= GUNZIP_WSIZE - 1; | 580 | dd &= GUNZIP_WSIZE - 1; |
579 | e = GUNZIP_WSIZE - (dd > w ? dd : w); | 581 | e = GUNZIP_WSIZE - (dd > w ? dd : w); |
582 | delta = w > dd ? w - dd : dd - w; | ||
580 | if (e > nn) e = nn; | 583 | if (e > nn) e = nn; |
581 | nn -= e; | 584 | nn -= e; |
582 | 585 | ||
583 | /* copy to new buffer to prevent possible overwrite */ | 586 | /* copy to new buffer to prevent possible overwrite */ |
584 | if (w - dd >= e) { /* (this test assumes unsigned comparison) */ | 587 | if (delta >= e) { |
585 | memcpy(gunzip_window + w, gunzip_window + dd, e); | 588 | memcpy(gunzip_window + w, gunzip_window + dd, e); |
586 | w += e; | 589 | w += e; |
587 | dd += e; | 590 | dd += e; |