[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] xen/gunzip: Move input buffer handling into gunzip_state
commit fd273a5690f4ca4d19b79c42562e8b53c3197327 Author: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx> AuthorDate: Wed Apr 24 12:34:19 2024 -0400 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Thu May 9 18:19:49 2024 +0100 xen/gunzip: Move input buffer handling into gunzip_state Move the input buffer handling, buffer pointer(inbuf), size(insize), and index(inptr), into gunzip_state. Adjust functions and macros that consumed the input buffer to accept a struct gunzip_state reference. Convert get_byte() into a real function and subsume fill_inbuf(). Fix the failure path to work correctly when error() stops being a plain panic(). Signed-off-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx> Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- xen/common/gzip/gunzip.c | 30 ++++++++------- xen/common/gzip/inflate.c | 97 +++++++++++++++++++++++++---------------------- 2 files changed, 67 insertions(+), 60 deletions(-) diff --git a/xen/common/gzip/gunzip.c b/xen/common/gzip/gunzip.c index f2c3a5b6cd..a04ddd7445 100644 --- a/xen/common/gzip/gunzip.c +++ b/xen/common/gzip/gunzip.c @@ -11,13 +11,12 @@ struct gunzip_state { /* window position */ unsigned int wp; -}; - -static unsigned char *__initdata inbuf; -static unsigned int __initdata insize; -/* Index of next byte to be processed in inbuf: */ -static unsigned int __initdata inptr; + unsigned char *inbuf; + unsigned int insize; + /* Index of next byte to be processed in inbuf: */ + unsigned int inptr; +}; #define malloc(a) xmalloc_bytes(a) #define free(a) xfree(a) @@ -27,8 +26,6 @@ typedef unsigned char uch; typedef unsigned short ush; typedef unsigned long ulg; -#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf()) - /* Diagnostic functions */ #ifdef DEBUG # define Assert(cond, msg) do { if (!(cond)) error(msg); } while (0) @@ -54,10 +51,15 @@ static __init void error(const char *x) panic("%s\n", x); } -static __init int fill_inbuf(void) +static __init int get_byte(struct gunzip_state *s) { - error("ran out of input data"); - return 0; + if ( s->inptr >= s->insize ) + { + error("ran out of input data"); + return -1; + } + + return s->inbuf[s->inptr++]; } #include "inflate.c" @@ -110,9 +112,9 @@ __init int perform_gunzip(char *output, char *image, unsigned long image_len) return -ENOMEM; s->window = (unsigned char *)output; - inbuf = (unsigned char *)image; - insize = image_len; - inptr = 0; + s->inbuf = (unsigned char *)image; + s->insize = image_len; + s->inptr = 0; bytes_out = 0; makecrc(); diff --git a/xen/common/gzip/inflate.c b/xen/common/gzip/inflate.c index 651056ef24..62179e6ed6 100644 --- a/xen/common/gzip/inflate.c +++ b/xen/common/gzip/inflate.c @@ -220,8 +220,8 @@ static const ush mask_bits[] = { 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff }; -#define NEXTBYTE() ({ int v = get_byte(); if (v < 0) goto underrun; (uch)v; }) -#define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE())<<k;k+=8;}} +#define NEXTBYTE(s) ({ int v = get_byte(s); if (v < 0) goto underrun; (uch)v; }) +#define NEEDBITS(s, n) {while(k<(n)){b|=((ulg)NEXTBYTE(s))<<k;k+=8;}} #define DUMPBITS(n) {b>>=(n);k-=(n);} /* @@ -562,14 +562,14 @@ static int __init inflate_codes( md = mask_bits[bd]; for (;;) /* do until end of block */ { - NEEDBITS((unsigned)bl); + NEEDBITS(s, (unsigned)bl); if ((e = (t = tl + ((unsigned)b & ml))->e) > 16) do { if (e == 99) return 1; DUMPBITS(t->b); e -= 16; - NEEDBITS(e); + NEEDBITS(s, e); } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16); DUMPBITS(t->b); if (e == 16) /* then it's a literal */ @@ -590,22 +590,22 @@ static int __init inflate_codes( break; /* get length of block to copy */ - NEEDBITS(e); + NEEDBITS(s, e); n = t->v.n + ((unsigned)b & mask_bits[e]); DUMPBITS(e); /* decode distance of block to copy */ - NEEDBITS((unsigned)bd); + NEEDBITS(s, (unsigned)bd); if ((e = (t = td + ((unsigned)b & md))->e) > 16) do { if (e == 99) return 1; DUMPBITS(t->b); e -= 16; - NEEDBITS(e); + NEEDBITS(s, e); } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16); DUMPBITS(t->b); - NEEDBITS(e); + NEEDBITS(s, e); d = w - t->v.n - ((unsigned)b & mask_bits[e]); DUMPBITS(e); Tracevv((stderr,"\\[%d,%d]", w-d, n)); @@ -668,10 +668,10 @@ static int __init inflate_stored(struct gunzip_state *s) /* get the length and its complement */ - NEEDBITS(16); + NEEDBITS(s, 16); n = ((unsigned)b & 0xffff); DUMPBITS(16); - NEEDBITS(16); + NEEDBITS(s, 16); if (n != (unsigned)((~b) & 0xffff)) return 1; /* error in compressed data */ DUMPBITS(16); @@ -679,7 +679,7 @@ static int __init inflate_stored(struct gunzip_state *s) /* read and output the compressed data */ while (n--) { - NEEDBITS(8); + NEEDBITS(s, 8); s->window[w++] = (uch)b; if (w == WSIZE) { @@ -802,13 +802,13 @@ static int noinline __init inflate_dynamic(struct gunzip_state *s) k = bk; /* read in table lengths */ - NEEDBITS(5); + NEEDBITS(s, 5); nl = 257 + ((unsigned)b & 0x1f); /* number of literal/length codes */ DUMPBITS(5); - NEEDBITS(5); + NEEDBITS(s, 5); nd = 1 + ((unsigned)b & 0x1f); /* number of distance codes */ DUMPBITS(5); - NEEDBITS(4); + NEEDBITS(s, 4); nb = 4 + ((unsigned)b & 0xf); /* number of bit length codes */ DUMPBITS(4); if (nl > 286 || nd > 30) @@ -822,7 +822,7 @@ static int noinline __init inflate_dynamic(struct gunzip_state *s) /* read in bit-length-code lengths */ for (j = 0; j < nb; j++) { - NEEDBITS(3); + NEEDBITS(s, 3); ll[border[j]] = (unsigned)b & 7; DUMPBITS(3); } @@ -849,7 +849,7 @@ static int noinline __init inflate_dynamic(struct gunzip_state *s) i = l = 0; while ((unsigned)i < n) { - NEEDBITS((unsigned)bl); + NEEDBITS(s, (unsigned)bl); j = (td = tl + ((unsigned)b & m))->b; DUMPBITS(j); j = td->v.n; @@ -857,7 +857,7 @@ static int noinline __init inflate_dynamic(struct gunzip_state *s) ll[i++] = l = j; /* save last length in l */ else if (j == 16) /* repeat last length 3 to 6 times */ { - NEEDBITS(2); + NEEDBITS(s, 2); j = 3 + ((unsigned)b & 3); DUMPBITS(2); if ((unsigned)i + j > n) { @@ -869,7 +869,7 @@ static int noinline __init inflate_dynamic(struct gunzip_state *s) } else if (j == 17) /* 3 to 10 zero length codes */ { - NEEDBITS(3); + NEEDBITS(s, 3); j = 3 + ((unsigned)b & 7); DUMPBITS(3); if ((unsigned)i + j > n) { @@ -882,7 +882,7 @@ static int noinline __init inflate_dynamic(struct gunzip_state *s) } else /* j == 18: 11 to 138 zero length codes */ { - NEEDBITS(7); + NEEDBITS(s, 7); j = 11 + ((unsigned)b & 0x7f); DUMPBITS(7); if ((unsigned)i + j > n) { @@ -975,12 +975,12 @@ static int __init inflate_block(struct gunzip_state *s, int *e) k = bk; /* read in last block bit */ - NEEDBITS(1); + NEEDBITS(s, 1); *e = (int)b & 1; DUMPBITS(1); /* read in block type */ - NEEDBITS(2); + NEEDBITS(s, 2); t = (unsigned)b & 3; DUMPBITS(2); @@ -1028,7 +1028,7 @@ static int __init inflate(struct gunzip_state *s) */ while (bk >= 8) { bk -= 8; - inptr--; + s->inptr--; } flush_window(s); @@ -1108,9 +1108,9 @@ static int __init gunzip(struct gunzip_state *s) ulg orig_len = 0; /* original uncompressed length */ int res; - magic[0] = NEXTBYTE(); - magic[1] = NEXTBYTE(); - method = NEXTBYTE(); + magic[0] = NEXTBYTE(s); + magic[1] = NEXTBYTE(s); + method = NEXTBYTE(s); if (magic[0] != 037 || /* octal-ok */ ((magic[1] != 0213) && (magic[1] != 0236))) { /* octal-ok */ @@ -1124,7 +1124,7 @@ static int __init gunzip(struct gunzip_state *s) return -1; } - flags = (uch)get_byte(); + flags = (uch)get_byte(s); if ((flags & ENCRYPTED) != 0) { error("Input is encrypted"); return -1; @@ -1137,29 +1137,34 @@ static int __init gunzip(struct gunzip_state *s) error("Input has invalid flags"); return -1; } - NEXTBYTE(); /* Get timestamp */ - NEXTBYTE(); - NEXTBYTE(); - NEXTBYTE(); + NEXTBYTE(s); /* Get timestamp */ + NEXTBYTE(s); + NEXTBYTE(s); + NEXTBYTE(s); - (void)NEXTBYTE(); /* Ignore extra flags for the moment */ - (void)NEXTBYTE(); /* Ignore OS type for the moment */ + NEXTBYTE(s); /* Ignore extra flags for the moment */ + NEXTBYTE(s); /* Ignore OS type for the moment */ if ((flags & EXTRA_FIELD) != 0) { - unsigned len = (unsigned)NEXTBYTE(); - len |= ((unsigned)NEXTBYTE())<<8; - while (len--) (void)NEXTBYTE(); + unsigned int len = NEXTBYTE(s); + + len |= (unsigned int)NEXTBYTE(s) << 8; + + while ( len-- ) + NEXTBYTE(s); } /* Get original file name if it was truncated */ if ((flags & ORIG_NAME) != 0) { /* Discard the old name */ - while (NEXTBYTE() != 0) /* null */ ; + while ( NEXTBYTE(s) != 0) /* null */ + ; } /* Discard file comment if any */ if ((flags & COMMENT) != 0) { - while (NEXTBYTE() != 0) /* null */ ; + while ( NEXTBYTE(s) != 0 ) /* null */ + ; } /* Decompress */ @@ -1190,15 +1195,15 @@ static int __init gunzip(struct gunzip_state *s) /* crc32 (see algorithm.doc) * uncompressed input size modulo 2^32 */ - orig_crc = (ulg) NEXTBYTE(); - orig_crc |= (ulg) NEXTBYTE() << 8; - orig_crc |= (ulg) NEXTBYTE() << 16; - orig_crc |= (ulg) NEXTBYTE() << 24; - - orig_len = (ulg) NEXTBYTE(); - orig_len |= (ulg) NEXTBYTE() << 8; - orig_len |= (ulg) NEXTBYTE() << 16; - orig_len |= (ulg) NEXTBYTE() << 24; + orig_crc = (ulg) NEXTBYTE(s); + orig_crc |= (ulg) NEXTBYTE(s) << 8; + orig_crc |= (ulg) NEXTBYTE(s) << 16; + orig_crc |= (ulg) NEXTBYTE(s) << 24; + + orig_len = (ulg) NEXTBYTE(s); + orig_len |= (ulg) NEXTBYTE(s) << 8; + orig_len |= (ulg) NEXTBYTE(s) << 16; + orig_len |= (ulg) NEXTBYTE(s) << 24; /* Validate decompression */ if (orig_crc != CRC_VALUE) { -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |