static void decompress(const char* fname, const ZSTD_DDict* ddict) { size_t cSize; void* const cBuff = loadFile_orDie(fname, &cSize); unsigned long long const rSize = ZSTD_findDecompressedSize(cBuff, cSize); if (rSize==ZSTD_CONTENTSIZE_ERROR) { fprintf(stderr, "%s : it was not compressed by zstd.\n", fname); exit(5); } else if (rSize==ZSTD_CONTENTSIZE_UNKNOWN) { fprintf(stderr, "%s : original size unknown \n", fname); exit(6); } void* const rBuff = malloc_orDie((size_t)rSize); ZSTD_DCtx* const dctx = ZSTD_createDCtx(); if (dctx==NULL) { fprintf(stderr, "ZSTD_createDCtx() error \n"); exit(10); } size_t const dSize = ZSTD_decompress_usingDDict(dctx, rBuff, rSize, cBuff, cSize, ddict); if (dSize != rSize) { fprintf(stderr, "error decoding %s : %s \n", fname, ZSTD_getErrorName(dSize)); exit(7); } /* success */ printf("%25s : %6u -> %7u \n", fname, (unsigned)cSize, (unsigned)rSize); ZSTD_freeDCtx(dctx); free(rBuff); free(cBuff); }
static void decompress(const char* fname, const ZSTD_DDict* ddict) { size_t cSize; void* const cBuff = loadFileX(fname, &cSize); unsigned long long const rSize = ZSTD_getDecompressedSize(cBuff, cSize); if (rSize==0) { printf("%s : original size unknown \n", fname); exit(5); } void* const rBuff = mallocX(rSize); ZSTD_DCtx* const dctx = ZSTD_createDCtx(); size_t const dSize = ZSTD_decompress_usingDDict(dctx, rBuff, rSize, cBuff, cSize, ddict); if (dSize != rSize) { printf("error decoding %s : %s \n", fname, ZSTD_getErrorName(dSize)); exit(7); } /* success */ printf("%25s : %6u -> %7u \n", fname, (unsigned)cSize, (unsigned)rSize); ZSTD_freeDCtx(dctx); free(rBuff); free(cBuff); }
static int nextchunk(struct solv_zchunk *zck, unsigned int streamid) { unsigned char *p = zck->chunks; unsigned char *chunk_chk_ptr; unsigned int sid, chunk_len, uncompressed_len; unsigned char *cbuf; /* free old buffer */ zck->buf = solv_free(zck->buf); zck->buf_avail = 0; zck->buf_used = 0; for (;;) { if (zck->nchunks == 0) { zck->chunks = p; return 1; /* EOF reached */ } if (p >= zck->hdr_end) return 0; sid = streamid ? 1 : 0; /* check if this is the correct stream */ if ((zck->flags & 1) != 0 && (p = getuint(p, zck->hdr_end, &sid)) == 0) return 0; chunk_chk_ptr = p; /* remember for verification */ p += zck->chunk_chk_len; if (p >= zck->hdr_end) return 0; if ((p = getuint(p, zck->hdr_end, &chunk_len)) == 0) return 0; if ((p = getuint(p, zck->hdr_end, &uncompressed_len)) == 0) return 0; zck->nchunks--; if (sid == streamid) break; /* skip the chunk, but the dict chunk must come first */ if (streamid == 0 || skip_bytes(zck->fp, chunk_len, zck->data_chk) == 0) return 0; } zck->chunks = p; /* ok, read the compressed chunk */ if (!chunk_len) return uncompressed_len ? 0 : 1; cbuf = solv_malloc(chunk_len); if (fread(cbuf, chunk_len, 1, zck->fp) != 1) { solv_free(cbuf); return 0; } if (zck->data_chk) solv_chksum_add(zck->data_chk, cbuf, chunk_len); /* verify the chunk checksum */ if (zck->chunk_chk_id) { Chksum *chk = solv_chksum_create(zck->chunk_chk_id); if (!chk) { solv_free(cbuf); return 0; } solv_chksum_add(chk, cbuf, chunk_len); if (memcmp(solv_chksum_get(chk, 0), chunk_chk_ptr, zck->chunk_chk_len) != 0) { solv_chksum_free(chk, 0); solv_free(cbuf); return 0; } solv_chksum_free(chk, 0); } /* uncompress */ if (zck->comp == 0) { /* not compressed */ if (chunk_len != uncompressed_len) { solv_free(cbuf); return 0; } zck->buf = cbuf; zck->buf_avail = uncompressed_len; return 1; } if (zck->comp == 2) { /* zstd compressed */ size_t r; zck->buf = solv_malloc(uncompressed_len + 1); /* +1 so we can detect too large frames */ if (zck->ddict) r = ZSTD_decompress_usingDDict(zck->dctx, zck->buf, uncompressed_len + 1, cbuf, chunk_len, zck->ddict); else r = ZSTD_decompressDCtx(zck->dctx, zck->buf, uncompressed_len + 1, cbuf, chunk_len); solv_free(cbuf); if (r != uncompressed_len) return 0; zck->buf_avail = uncompressed_len; return 1; } solv_free(cbuf); return 0; }