|
19 | 19 | types::{PyBytes, PyList}, |
20 | 20 | wrap_pyfunction, |
21 | 21 | }, |
22 | | - std::{ |
23 | | - ffi::c_ulonglong, |
24 | | - sync::Arc |
25 | | - }, |
| 22 | + std::{ffi::c_ulonglong, sync::Arc}, |
26 | 23 | }; |
27 | 24 |
|
28 | 25 | #[pyclass(module = "zstandard.backend_rust")] |
@@ -181,27 +178,35 @@ impl ZstdDecompressor { |
181 | 178 |
|
182 | 179 | self.setup_dctx(py, true)?; |
183 | 180 |
|
184 | | - let output_size = |
185 | | - unsafe { zstd_sys::ZSTD_getFrameContentSize(buffer.buf_ptr(), buffer.len_bytes()) }; |
| 181 | + let mut header: zstd_sys::ZSTD_FrameHeader = unsafe { std::mem::zeroed() }; |
| 182 | + let zresult = unsafe { |
| 183 | + zstd_sys::ZSTD_getFrameHeader_advanced( |
| 184 | + &mut header, |
| 185 | + buffer.buf_ptr(), |
| 186 | + buffer.len_bytes(), |
| 187 | + self.format, |
| 188 | + ) |
| 189 | + }; |
| 190 | + |
| 191 | + if zresult != 0 { |
| 192 | + return Err(ZstdError::new_err( |
| 193 | + "error determining content size from frame header", |
| 194 | + )); |
| 195 | + } |
186 | 196 |
|
187 | | - let (output_buffer_size, output_size) = |
188 | | - if output_size == zstd_sys::ZSTD_CONTENTSIZE_ERROR as c_ulonglong { |
| 197 | + let (output_buffer_size, output_size) = if header.frameContentSize == 0 { |
| 198 | + return Ok(PyBytes::new(py, &[])); |
| 199 | + } else if header.frameContentSize == zstd_sys::ZSTD_CONTENTSIZE_UNKNOWN as c_ulonglong { |
| 200 | + if max_output_size == 0 { |
189 | 201 | return Err(ZstdError::new_err( |
190 | | - "error determining content size from frame header", |
| 202 | + "could not determine content size in frame header", |
191 | 203 | )); |
192 | | - } else if output_size == 0 { |
193 | | - return Ok(PyBytes::new(py, &[])); |
194 | | - } else if output_size == zstd_sys::ZSTD_CONTENTSIZE_UNKNOWN as c_ulonglong { |
195 | | - if max_output_size == 0 { |
196 | | - return Err(ZstdError::new_err( |
197 | | - "could not determine content size in frame header", |
198 | | - )); |
199 | | - } |
| 204 | + } |
200 | 205 |
|
201 | | - (max_output_size, 0) |
202 | | - } else { |
203 | | - (output_size as _, output_size) |
204 | | - }; |
| 206 | + (max_output_size, 0) |
| 207 | + } else { |
| 208 | + (header.frameContentSize as _, header.frameContentSize) |
| 209 | + }; |
205 | 210 |
|
206 | 211 | let mut dest_buffer: Vec<u8> = Vec::new(); |
207 | 212 | dest_buffer |
|
0 commit comments