X-Git-Url: https://git.gag.com/?p=debian%2Fgzip;a=blobdiff_plain;f=deflate.c;h=2f55a7cc8b8fa5b7bb50cff8ee41d469e1a5afa3;hp=25800e916223fa76ff36b8481170f362c7e5615e;hb=0d5a754ba8f2cc33e98d48d559f0ad6cd18a43a3;hpb=ad96056bdcf62abd585cdb53768fbabdde75d1b5 diff --git a/deflate.c b/deflate.c index 25800e9..2f55a7c 100644 --- a/deflate.c +++ b/deflate.c @@ -1,8 +1,21 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1992-1993 Jean-loup Gailly - * This is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License, see the file COPYING. - */ + + Copyright (C) 1999, 2006 Free Software Foundation, Inc. + Copyright (C) 1992-1993 Jean-loup Gailly + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * PURPOSE @@ -69,7 +82,7 @@ #include "lzw.h" /* just for consistency checking */ #ifdef RCSID -static char rcsid[] = "$Id: deflate.c,v 0.15 1993/06/24 10:53:53 jloup Exp $"; +static char rcsid[] = "$Id: deflate.c,v 1.5 2006/12/07 23:53:00 eggert Exp $"; #endif /* =========================================================================== @@ -290,7 +303,7 @@ void lm_init (pack_level, flags) { register unsigned j; - if (pack_level < 1 || pack_level > 9) error("bad pack level"); + if (pack_level < 1 || pack_level > 9) gzip_error ("bad pack level"); compr_level = pack_level; /* Initialize the hash table. */ @@ -495,7 +508,7 @@ local void check_match(start, match, length) fprintf(stderr, " start %d, match %d, length %d\n", start, match, length); - error("invalid match"); + gzip_error ("invalid match"); } if (verbose > 1) { fprintf(stderr,"\\[%d,%d]", start-match, length); @@ -594,7 +607,8 @@ local off_t deflate_fast() /* Find the longest match, discarding those <= prev_length. * At this point we have always match_length < MIN_MATCH */ - if (hash_head != NIL && strstart - hash_head <= MAX_DIST) { + if (hash_head != NIL && strstart - hash_head <= MAX_DIST + && strstart <= window_size - MIN_LOOKAHEAD) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). @@ -624,7 +638,7 @@ local off_t deflate_fast() * the next lookahead bytes will be emitted as literals. */ } while (--match_length != 0); - strstart++; + strstart++; } else { strstart += match_length; match_length = 0; @@ -639,7 +653,7 @@ local off_t deflate_fast() Tracevv((stderr,"%c",window[strstart])); flush = ct_tally (0, window[strstart]); lookahead--; - strstart++; + strstart++; } if (flush) FLUSH_BLOCK(0), block_start = strstart; @@ -682,7 +696,8 @@ off_t deflate() match_length = MIN_MATCH-1; if (hash_head != NIL && prev_length < max_lazy_match && - strstart - hash_head <= MAX_DIST) { + strstart - hash_head <= MAX_DIST && + strstart <= window_size - MIN_LOOKAHEAD) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file).