X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=modules%2Fdeflate.c;h=f77f6eb657dfbca1a932961677f6357d853bcc18;hb=fcdb3f7ce6256f00c1e7ed31be6f1205b151c485;hp=67c6c16b71ea35dd6cc918693f2f3ab95237b59d;hpb=1e1a4695859cbe84201bb8da80bc8b59b5b4a1df;p=ppp.git diff --git a/modules/deflate.c b/modules/deflate.c index 67c6c16..f77f6eb 100644 --- a/modules/deflate.c +++ b/modules/deflate.c @@ -27,7 +27,7 @@ * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, * OR MODIFICATIONS. * - * $Id: deflate.c,v 1.6 1997/11/27 06:05:17 paulus Exp $ + * $Id: deflate.c,v 1.10 2001/03/09 01:03:50 paulus Exp $ */ #ifdef AIX4 @@ -45,7 +45,7 @@ #ifdef __osf__ #include "zlib.h" #else -#include "common/zlib.h" +#include "../common/zlib.h" #endif #if DO_DEFLATE @@ -89,7 +89,7 @@ static void z_decomp_reset __P((void *state)); static void z_comp_stats __P((void *state, struct compstat *stats)); /* - * Procedures exported to if_ppp.c. + * Procedures exported to ppp_comp.c. */ struct compressor ppp_deflate = { CI_DEFLATE, /* compress_proto */ @@ -108,6 +108,23 @@ struct compressor ppp_deflate = { z_comp_stats, /* decomp_stat */ }; +struct compressor ppp_deflate_draft = { + CI_DEFLATE_DRAFT, /* compress_proto */ + z_comp_alloc, /* comp_alloc */ + z_comp_free, /* comp_free */ + z_comp_init, /* comp_init */ + z_comp_reset, /* comp_reset */ + z_compress, /* compress */ + z_comp_stats, /* comp_stat */ + z_decomp_alloc, /* decomp_alloc */ + z_decomp_free, /* decomp_free */ + z_decomp_init, /* decomp_init */ + z_decomp_reset, /* decomp_reset */ + z_decompress, /* decompress */ + z_incomp, /* incomp */ + z_comp_stats, /* decomp_stat */ +}; + #define DECOMP_CHUNK 512 /* @@ -178,13 +195,18 @@ z_comp_alloc(options, opt_len) struct deflate_state *state; int w_size; - if (opt_len != CILEN_DEFLATE || options[0] != CI_DEFLATE + if (opt_len != CILEN_DEFLATE + || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT) || options[1] != CILEN_DEFLATE || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL || options[3] != DEFLATE_CHK_SEQUENCE) return NULL; w_size = DEFLATE_SIZE(options[2]); - if (w_size < DEFLATE_MIN_SIZE || w_size > DEFLATE_MAX_SIZE) + /* + * N.B. the 9 below should be DEFLATE_MIN_SIZE (8), but using + * 8 will cause kernel crashes because of a bug in zlib. + */ + if (w_size < 9 || w_size > DEFLATE_MAX_SIZE) return NULL; @@ -230,7 +252,8 @@ z_comp_init(arg, options, opt_len, unit, hdrlen, debug) { struct deflate_state *state = (struct deflate_state *) arg; - if (opt_len < CILEN_DEFLATE || options[0] != CI_DEFLATE + if (opt_len < CILEN_DEFLATE + || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT) || options[1] != CILEN_DEFLATE || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL || DEFLATE_SIZE(options[2]) != state->w_size @@ -286,8 +309,15 @@ z_compress(arg, mret, mp, orig_len, maxolen) /* Allocate one mblk initially. */ if (maxolen > orig_len) maxolen = orig_len; - wspace = maxolen < 4096? maxolen: 4096; - m = allocb(wspace, BPRI_MED); + if (maxolen <= PPP_HDRLEN + 2) { + wspace = 0; + m = NULL; + } else { + wspace = maxolen + state->hdrlen; + if (wspace > 4096) + wspace = 4096; + m = allocb(wspace, BPRI_MED); + } if (m != NULL) { *mret = m; if (state->hdrlen + PPP_HDRLEN + 2 < wspace) { @@ -343,11 +373,16 @@ z_compress(arg, mret, mp, orig_len, maxolen) m->b_wptr += wspace; olen += wspace; wspace = maxolen - olen; - if (wspace < 32) - wspace = 32; - else if (wspace > 4096) - wspace = 4096; - m->b_cont = allocb(wspace, BPRI_MED); + if (wspace <= 0) { + wspace = 0; + m->b_cont = NULL; + } else { + if (wspace < 32) + wspace = 32; + else if (wspace > 4096) + wspace = 4096; + m->b_cont = allocb(wspace, BPRI_MED); + } m = m->b_cont; if (m != NULL) { state->strm.next_out = m->b_wptr; @@ -360,8 +395,10 @@ z_compress(arg, mret, mp, orig_len, maxolen) } } } - m->b_wptr += wspace - state->strm.avail_out; - olen += wspace - state->strm.avail_out; + if (m != NULL) { + m->b_wptr += wspace - state->strm.avail_out; + olen += wspace - state->strm.avail_out; + } /* * See if we managed to reduce the size of the packet. @@ -414,13 +451,18 @@ z_decomp_alloc(options, opt_len) struct deflate_state *state; int w_size; - if (opt_len != CILEN_DEFLATE || options[0] != CI_DEFLATE + if (opt_len != CILEN_DEFLATE + || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT) || options[1] != CILEN_DEFLATE || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL || options[3] != DEFLATE_CHK_SEQUENCE) return NULL; w_size = DEFLATE_SIZE(options[2]); - if (w_size < DEFLATE_MIN_SIZE || w_size > DEFLATE_MAX_SIZE) + /* + * N.B. the 9 below should be DEFLATE_MIN_SIZE (8), but using + * 8 will cause kernel crashes because of a bug in zlib. + */ + if (w_size < 9 || w_size > DEFLATE_MAX_SIZE) return NULL; #ifdef __osf__ @@ -463,7 +505,8 @@ z_decomp_init(arg, options, opt_len, unit, hdrlen, mru, debug) { struct deflate_state *state = (struct deflate_state *) arg; - if (opt_len < CILEN_DEFLATE || options[0] != CI_DEFLATE + if (opt_len < CILEN_DEFLATE + || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT) || options[1] != CILEN_DEFLATE || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL || DEFLATE_SIZE(options[2]) != state->w_size @@ -552,6 +595,7 @@ z_decompress(arg, mi, mop) mo->b_rptr += state->hdrlen; mo->b_wptr = wptr = mo->b_rptr; ospace = DECOMP_CHUNK; + olen = 0; /* * Fill in the first part of the PPP header. The protocol field @@ -574,7 +618,6 @@ z_decompress(arg, mi, mop) state->strm.next_out = wptr + 3; state->strm.avail_out = 1; decode_proto = 1; - olen = PPP_HDRLEN; /* * Call inflate, supplying more input or output as needed. @@ -608,7 +651,6 @@ z_decompress(arg, mi, mop) wptr[2] = wptr[3]; --state->strm.next_out; ++state->strm.avail_out; - --olen; } decode_proto = 0; } else {