@@ -15,6 +15,9 @@ from .abc import Codec
1515
1616from libc.stdlib cimport malloc, realloc, free
1717
18+ cdef extern from " stdint.h" :
19+ cdef size_t SIZE_MAX
20+
1821cdef extern from " zstd.h" :
1922
2023 unsigned ZSTD_versionNumber() nogil
@@ -204,8 +207,8 @@ def decompress(source, dest=None):
204207 Py_buffer* dest_pb
205208 char * dest_ptr
206209 size_t source_size, dest_size, decompressed_size
207- size_t nbytes, cbytes, blocksize
208210 size_t dest_nbytes
211+ unsigned long long content_size
209212
210213 # obtain source memoryview
211214 source_mv = ensure_continguous_memoryview(source)
@@ -216,18 +219,24 @@ def decompress(source, dest=None):
216219 source_size = source_pb.len
217220
218221 try :
219-
220- # determine uncompressed size
222+ # determine uncompressed size using unsigned long long for full range
221223 try :
222- dest_size = findTotalContentSize(source_ptr, source_size)
224+ content_size = findTotalContentSize(source_ptr, source_size)
223225 except RuntimeError :
224226 raise RuntimeError (' Zstd decompression error: invalid input data' )
225227
226- if dest_size == 0 or dest_size == ZSTD_CONTENTSIZE_ERROR:
228+ if content_size == ZSTD_CONTENTSIZE_UNKNOWN and dest is None :
229+ return stream_decompress(source_pb)
230+ elif content_size == ZSTD_CONTENTSIZE_UNKNOWN:
231+ # dest is not None
232+ # set dest_size based on dest
233+ pass
234+ elif content_size == ZSTD_CONTENTSIZE_ERROR or content_size == 0 :
227235 raise RuntimeError (' Zstd decompression error: invalid input data' )
236+ elif content_size > (< unsigned long long > SIZE_MAX):
237+ raise RuntimeError (' Zstd decompression error: content size too large for platform' )
228238
229- if dest_size == ZSTD_CONTENTSIZE_UNKNOWN and dest is None :
230- return stream_decompress(source_pb)
239+ dest_size = < size_t> content_size
231240
232241 # setup destination buffer
233242 if dest is None :
@@ -242,7 +251,7 @@ def decompress(source, dest=None):
242251 dest_ptr = < char * > dest_pb.buf
243252 dest_nbytes = dest_pb.len
244253
245- if dest_size == ZSTD_CONTENTSIZE_UNKNOWN:
254+ if content_size == ZSTD_CONTENTSIZE_UNKNOWN:
246255 dest_size = dest_nbytes
247256
248257 # validate output buffer
0 commit comments