From: Michael Schroeder Date: Thu, 24 Jan 2019 15:26:21 +0000 (+0100) Subject: zchunk: support skipping of optional elements X-Git-Tag: 0.7.3~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=75fa17b93f104e72b19d23638140bf2ce3513865;p=thirdparty%2Flibsolv.git zchunk: support skipping of optional elements --- diff --git a/ext/solv_zchunk.c b/ext/solv_zchunk.c index 0833445f..664b739b 100644 --- a/ext/solv_zchunk.c +++ b/ext/solv_zchunk.c @@ -300,10 +300,28 @@ solv_zchunk_open(FILE *fp, unsigned int streamid) #endif if ((p = getuint(p, zck->hdr_end, &zck->flags)) == 0) return open_error(zck); - if ((zck->flags & ~(1)) != 0) + if ((zck->flags & ~(3)) != 0) return open_error(zck); if ((p = getuint(p, zck->hdr_end, &zck->comp)) == 0 || (zck->comp != 0 && zck->comp != 2)) return open_error(zck); /* only uncompressed + zstd supported */ + /* skip all optional elements if present */ + if ((zck->flags & 2) != 0) + { + unsigned int nopt, lopt; + if ((p = getuint(p, zck->hdr_end, &nopt)) == 0) + return open_error(zck); + for (; nopt != 0; nopt--) + { + if ((p = getuint(p, zck->hdr_end, &lopt)) == 0) + return open_error(zck); + if ((p = getuint(p, zck->hdr_end, &lopt)) == 0) + return open_error(zck); + if (p + lopt > zck->hdr_end) + return open_error(zck); + p += lopt; + } + } + preface_size = p - (zck->hdr + lead_size); /* parse index: index size, index chksum type, num chunks, chunk data */