Introduction
The Zstandard plugin for HDF5 should be modified to allow for an unknown decompressed size in the frame header.
Currently, the Zstd decompression scheme, following from the original implemention, uses ZSTD_getDecompressedSize to obtain the size of the decompressed buffer. The returned value is not validated and passed directly to malloc.
|
size_t decompSize = ZSTD_getDecompressedSize(*buf, origSize); |
|
if (NULL == (outbuf = malloc(decompSize))) |
ZSTD_getDecompressedSize returns 0 if the decompressed size is empty, unknown, or an error has occured. If malloc is asked to allocate 0 bytes, it will return NULL, resulting in returning an error condition. This is an incorrect result if the decompressed size is actually empty or unknown and there is no actual error. ZSTD_getDecompressedSize is obsolete.
ZSTD_getFrameContentSize should replace the use of ZSTD_getDecompressedSize. ZSTD_getFrameContentSize distinguishes between empty, unknown, or an error. The unknown or error states are indicated by a return value of ZSTD_CONTENTSIZE_UNKNOWN or ZSTD_CONTENTSIZE_ERROR, respectively.
The unknown decompression state is common. This occurs when the compression is done via the streaming API via ZSTD_compressStream or ZSTD_compressStream2. ZSTD_compressStream2 in particular only stores the frame size when either ZSTD_e_end is provided on the initial call or ZSTD_CCtx_setPledgedSrcSize is used.
Tasks
References
[1] https://facebook.github.io/zstd/zstd_manual.html
Introduction
The Zstandard plugin for HDF5 should be modified to allow for an unknown decompressed size in the frame header.
Currently, the Zstd decompression scheme, following from the original implemention, uses
ZSTD_getDecompressedSizeto obtain the size of the decompressed buffer. The returned value is not validated and passed directly tomalloc.hdf5_plugins/ZSTD/src/H5Zzstd.c
Lines 59 to 60 in 770d70a
ZSTD_getDecompressedSizereturns0if the decompressed size is empty, unknown, or an error has occured. Ifmallocis asked to allocate0bytes, it will returnNULL, resulting in returning an error condition. This is an incorrect result if the decompressed size is actually empty or unknown and there is no actual error.ZSTD_getDecompressedSizeis obsolete.ZSTD_getFrameContentSizeshould replace the use ofZSTD_getDecompressedSize.ZSTD_getFrameContentSizedistinguishes between empty, unknown, or an error. The unknown or error states are indicated by a return value ofZSTD_CONTENTSIZE_UNKNOWNorZSTD_CONTENTSIZE_ERROR, respectively.The unknown decompression state is common. This occurs when the compression is done via the streaming API via
ZSTD_compressStreamorZSTD_compressStream2.ZSTD_compressStream2in particular only stores the frame size when eitherZSTD_e_endis provided on the initial call orZSTD_CCtx_setPledgedSrcSizeis used.Tasks
ZSTD_getFrameContentSizeinstead of the obsoleteZSTD_getDecompressedSizeto correctly distinguish between empty, unknown, or error states when determining the decompressed size.ZSTD_getFrameContentSizeagainstZSTD_CONTENTSIZE_UNKNOWNZSTD_decompressStreamReferences
[1] https://facebook.github.io/zstd/zstd_manual.html