]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
zchunk: support skipping of optional elements
authorMichael Schroeder <mls@suse.de>
Thu, 24 Jan 2019 15:26:21 +0000 (16:26 +0100)
committerMichael Schroeder <mls@suse.de>
Thu, 24 Jan 2019 15:26:48 +0000 (16:26 +0100)
ext/solv_zchunk.c

index 0833445f1c8ff8a4d1efdab6463382bff1816efb..664b739b90de0cecb6c5663b0470b4240ccf43f7 100644 (file)
@@ -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  */