@@ -15,6 +15,9 @@ from .abc import Codec
15
15
16
16
from libc.stdlib cimport malloc, realloc, free
17
17
18
+ cdef extern from " stdint.h" :
19
+ cdef size_t SIZE_MAX
20
+
18
21
cdef extern from " zstd.h" :
19
22
20
23
unsigned ZSTD_versionNumber() nogil
@@ -202,8 +205,8 @@ def decompress(source, dest=None):
202
205
Py_buffer* dest_pb
203
206
char * dest_ptr
204
207
size_t source_size, dest_size, decompressed_size
205
- size_t nbytes, cbytes, blocksize
206
208
size_t dest_nbytes
209
+ unsigned long long content_size
207
210
208
211
# obtain source memoryview
209
212
source_mv = ensure_continguous_memoryview(source)
@@ -214,14 +217,20 @@ def decompress(source, dest=None):
214
217
source_size = source_pb.len
215
218
216
219
try :
217
-
218
- # determine uncompressed size
219
- dest_size = ZSTD_getFrameContentSize(source_ptr, source_size)
220
- if dest_size == 0 or dest_size == ZSTD_CONTENTSIZE_ERROR:
220
+ # determine uncompressed size using unsigned long long for full range
221
+ content_size = ZSTD_getFrameContentSize(source_ptr, source_size)
222
+ if content_size == ZSTD_CONTENTSIZE_UNKNOWN and dest is None :
223
+ return stream_decompress(source_pb)
224
+ elif content_size == ZSTD_CONTENTSIZE_UNKNOWN:
225
+ # dest is not None
226
+ # set dest_size based on dest
227
+ pass
228
+ elif content_size == ZSTD_CONTENTSIZE_ERROR or content_size == 0 :
221
229
raise RuntimeError (' Zstd decompression error: invalid input data' )
230
+ elif content_size > (< unsigned long long > SIZE_MAX):
231
+ raise RuntimeError (' Zstd decompression error: content size too large for platform' )
222
232
223
- if dest_size == ZSTD_CONTENTSIZE_UNKNOWN and dest is None :
224
- return stream_decompress(source_pb)
233
+ dest_size = < size_t> content_size
225
234
226
235
# setup destination buffer
227
236
if dest is None :
@@ -236,7 +245,7 @@ def decompress(source, dest=None):
236
245
dest_ptr = < char * > dest_pb.buf
237
246
dest_nbytes = dest_pb.len
238
247
239
- if dest_size == ZSTD_CONTENTSIZE_UNKNOWN:
248
+ if content_size == ZSTD_CONTENTSIZE_UNKNOWN:
240
249
dest_size = dest_nbytes
241
250
242
251
# validate output buffer
0 commit comments