From 53c6f9fb43624e4d48ef3a624dfe9511ef631c0e Mon Sep 17 00:00:00 2001 From: Patrick McDermott Date: Mon, 17 Apr 2023 10:27:09 -0400 Subject: gzip: Make more robust --- diff --git a/src/gzip.c b/src/gzip.c index de733f9..302ba72 100644 --- a/src/gzip.c +++ b/src/gzip.c @@ -60,36 +60,49 @@ opkg_opk_gzip_init(opkg_opk_gzip_read_func *read, void *user_data) int opkg_opk_gzip_read(struct opkg_opk_gzip *gzip, void *record) { + int end; + gzip->stream.next_out = record; gzip->stream.avail_out = OPKG_OPK_USTAR_RECORD_SIZE; for (;;) { + end = 0; if (gzip->stream.avail_in == 0) { /* Input buffer is empty and needs refilled. */ switch (gzip->read(gzip->user_data, &gzip->stream.next_in, &gzip->stream.avail_in)) { case OPKG_OPK_OK: + break; case OPKG_OPK_END: + end = 1; break; case OPKG_OPK_ERROR: default: return OPKG_OPK_ERROR; } } - if (gzip->stream.avail_out == 0) { - /* Output buffer is filled and ready for use. */ - return OPKG_OPK_OK; - } switch (inflate(&gzip->stream, Z_SYNC_FLUSH)) { case Z_OK: + break; case Z_BUF_ERROR: + if (end == 1) { + return OPKG_OPK_ERROR; + } break; case Z_STREAM_END: + if (gzip->stream.avail_out != 0) { + /* Premature end */ + return OPKG_OPK_ERROR; + } return OPKG_OPK_END; default: return OPKG_OPK_ERROR; } + if (gzip->stream.avail_out == 0) { + /* Output buffer is filled and ready for use. */ + return OPKG_OPK_OK; + } } } -- cgit v0.9.1