zlib: fix zstd reset · nodejs/node@4cdcf7f · GitHub
Skip to content

Commit 4cdcf7f

Browse files
jasnelladuh95
authored andcommitted
zlib: fix zstd reset
Preserve dictionaries and params when zstd is reset. Update missing documentation. Signed-off-by: James M Snell <jasnell@gmail.com> Assisted-by: Opencode PR-URL: #65867 Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: Filip Skokan <panva.ip@gmail.com> Reviewed-By: Robert Nagy <ronagy@icloud.com>
1 parent 6eee01f commit 4cdcf7f

3 files changed

Lines changed: 116 additions & 6 deletions

File tree

‎doc/api/zlib.md‎

Lines changed: 8 additions & 2 deletions

‎src/node_zlib.cc‎

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1718,7 +1718,29 @@ CompressionError ZstdCompressContext::Init(uint64_t pledged_src_size,
17181718
}
17191719

17201720
CompressionError ZstdCompressContext::ResetStream() {
1721-
return Init(pledged_src_size_);
1721+
size_t result = ZSTD_CCtx_reset(cctx_.get(), ZSTD_reset_session_only);
1722+
if (ZSTD_isError(result)) {
1723+
const ZSTD_ErrorCode error = ZSTD_getErrorCode(result);
1724+
return CompressionError(
1725+
ZSTD_getErrorString(error), ZstdStrerror(error), error);
1726+
}
1727+
1728+
result = ZSTD_CCtx_setPledgedSrcSize(cctx_.get(), pledged_src_size_);
1729+
if (ZSTD_isError(result)) {
1730+
const ZSTD_ErrorCode error = ZSTD_getErrorCode(result);
1731+
return CompressionError(
1732+
ZSTD_getErrorString(error), ZstdStrerror(error), error);
1733+
}
1734+
1735+
if (pledged_src_size_ == ZSTD_CONTENTSIZE_UNKNOWN) {
1736+
consumed_src_size_.reset();
1737+
} else {
1738+
consumed_src_size_ = 0;
1739+
}
1740+
error_ = ZSTD_error_no_error;
1741+
error_string_.clear();
1742+
error_code_string_.clear();
1743+
return {};
17221744
}
17231745

17241746
void ZstdCompressContext::DoThreadPoolWork() {
@@ -1798,9 +1820,23 @@ CompressionError ZstdDecompressContext::Init(uint64_t pledged_src_size,
17981820
}
17991821

18001822
CompressionError ZstdDecompressContext::ResetStream() {
1801-
// We pass ZSTD_CONTENTSIZE_UNKNOWN because the argument is ignored for
1802-
// decompression.
1803-
return Init(ZSTD_CONTENTSIZE_UNKNOWN, {}, reject_garbage_after_end_);
1823+
const size_t result =
1824+
ZSTD_DCtx_reset(dctx_.get(), ZSTD_reset_session_only);
1825+
if (ZSTD_isError(result)) {
1826+
const ZSTD_ErrorCode error = ZSTD_getErrorCode(result);
1827+
return CompressionError(
1828+
ZSTD_getErrorString(error), ZstdStrerror(error), error);
1829+
}
1830+
1831+
frame_complete_ = false;
1832+
decoding_frame_after_complete_ = false;
1833+
ignoring_trailing_input_ = false;
1834+
frame_prefix_size_ = 0;
1835+
possible_frame_types_ = 0;
1836+
error_ = ZSTD_error_no_error;
1837+
error_string_.clear();
1838+
error_code_string_.clear();
1839+
return {};
18041840
}
18051841

18061842
void ZstdDecompressContext::DoThreadPoolWork() {
Lines changed: 68 additions & 0 deletions

0 commit comments

Comments
 (0)