diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 95a92d8b7..65c233646 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -65,8 +65,8 @@ size_t ZSTD_compressStream2_c(ZSTD_CCtx* cctx, ZSTD_outBuffer* output, ZSTD_inBuffer* input, ZSTD_EndDirective endOp); -int ZSTD_rust_simpleCompress2Level(const void* cctx); -int ZSTD_rust_simpleCompressStream2Level(const void* cctx); +int ZSTD_rust_simpleCompress2Level(const void* cctx, size_t srcSize); +int ZSTD_rust_simpleCompressStream2Level(const void* cctx, size_t srcSize); void ZSTD_rust_reduceIndex(U32* hashTable, U32 hashSize, U32* chainTable, U32 chainSize, U32* hashTable3, U32 hashSize3, @@ -3886,13 +3886,13 @@ void ZSTD_rust_markSimpleCompression2Complete(void* cctx) * the Rust frame path currently implements. All other contexts continue * through ZSTD_compress2_c(), preserving the full C stateful implementation * while this boundary is migrated incrementally. */ -int ZSTD_rust_simpleCompress2Level(const void* opaqueCctx) +int ZSTD_rust_simpleCompress2Level(const void* opaqueCctx, size_t srcSize) { ZSTD_CCtx const* const cctx = (ZSTD_CCtx const*)opaqueCctx; ZSTD_CCtx_params const* const params = cctx ? &cctx->requestedParams : NULL; ZSTD_compressionParameters const cParams = params ? ZSTD_getCParams_internal(params->compressionLevel, - ZSTD_CONTENTSIZE_UNKNOWN, 0, + srcSize, 0, ZSTD_cpm_noAttachDict) : (ZSTD_compressionParameters){ 0 }; if (params == NULL @@ -3959,7 +3959,7 @@ int ZSTD_rust_simpleCompress2Level(const void* opaqueCctx) * Rust handles this complete-input case; all other stream states stay on the * original implementation so partial output and advanced buffering remain * governed by the C state machine. */ -int ZSTD_rust_simpleCompressStream2Level(const void* opaqueCctx) +int ZSTD_rust_simpleCompressStream2Level(const void* opaqueCctx, size_t srcSize) { ZSTD_CCtx const* const cctx = (ZSTD_CCtx const*)opaqueCctx; if (cctx == NULL @@ -3968,7 +3968,7 @@ int ZSTD_rust_simpleCompressStream2Level(const void* opaqueCctx) || cctx->rustSimpleCompress2Completed != 0) { return (-2147483647 - 1); } - return ZSTD_rust_simpleCompress2Level(opaqueCctx); + return ZSTD_rust_simpleCompress2Level(opaqueCctx, srcSize); } /* ZSTD_compress() is implemented by rust/src/zstd_compress.rs. */ @@ -4932,7 +4932,8 @@ size_t ZSTD_compressStream2_c( ZSTD_CCtx* cctx, if (endOp == ZSTD_e_end && cctx->streamStage == zcss_init && cctx->pledgedSrcSizePlusOne == 0 - && ZSTD_rust_simpleCompress2Level(cctx) != (-2147483647 - 1)) { + && ZSTD_rust_simpleCompress2Level( + cctx, input->size - input->pos) != (-2147483647 - 1)) { void* const dst = output->dst ? (char*)output->dst + output->pos : output->dst; const void* const src = input->src ? diff --git a/rust/src/zstd_compress.rs b/rust/src/zstd_compress.rs index 076839a5a..f86a6356a 100644 --- a/rust/src/zstd_compress.rs +++ b/rust/src/zstd_compress.rs @@ -43,7 +43,7 @@ unsafe extern "C" { fn ZSTD_rust_compressCCtxStrategy(src_size: usize, compression_level: c_int) -> c_int; fn ZSTD_rust_resetCCtxForSimpleCompressionSession(cctx: *mut c_void) -> usize; fn ZSTD_rust_markSimpleCompression2Complete(cctx: *mut c_void); - fn ZSTD_rust_simpleCompress2Level(cctx: *const c_void) -> c_int; + fn ZSTD_rust_simpleCompress2Level(cctx: *const c_void, src_size: usize) -> c_int; fn ZSTD_compress_usingDict( cctx: *mut c_void, dst: *mut c_void, @@ -54,7 +54,7 @@ unsafe extern "C" { dict_size: usize, compression_level: c_int, ) -> usize; - fn ZSTD_rust_simpleCompressStream2Level(cctx: *const c_void) -> c_int; + fn ZSTD_rust_simpleCompressStream2Level(cctx: *const c_void, src_size: usize) -> c_int; fn ZSTD_compress2_c( cctx: *mut c_void, dst: *mut c_void, @@ -1195,7 +1195,7 @@ pub unsafe extern "C" fn ZSTD_compress2( #[cfg(not(test))] { - let level = unsafe { ZSTD_rust_simpleCompress2Level(cctx.cast_const()) }; + let level = unsafe { ZSTD_rust_simpleCompress2Level(cctx.cast_const(), src_size) }; if level != c_int::MIN { let reset = unsafe { ZSTD_rust_resetCCtxForSimpleCompressionSession(cctx) }; if ERR_isError(reset) { @@ -1244,10 +1244,10 @@ pub unsafe extern "C" fn ZSTD_compressStream2( return ERROR(ZstdErrorCode::SrcSizeWrong); } + let src_size = input_ref.size - input_ref.pos; if end_op == ZSTD_E_END { - let level = unsafe { ZSTD_rust_simpleCompressStream2Level(cctx.cast_const()) }; + let level = unsafe { ZSTD_rust_simpleCompressStream2Level(cctx.cast_const(), src_size) }; if level != c_int::MIN { - let src_size = input_ref.size - input_ref.pos; let dst_capacity = output_ref.size - output_ref.pos; let bound = ZSTD_compressBound(src_size); if !ERR_isError(bound) && dst_capacity >= bound {