@@ -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
@@ -202,8 +205,8 @@ def decompress(source, dest=None):
202205        Py_buffer*  dest_pb
203206        char *  dest_ptr
204207        size_t source_size, dest_size, decompressed_size
205-         size_t nbytes, cbytes, blocksize
206208        size_t dest_nbytes
209+         unsigned  long  long  content_size
207210
208211    #  obtain source memoryview
209212    source_mv =  ensure_continguous_memoryview(source)
@@ -214,14 +217,20 @@ def decompress(source, dest=None):
214217    source_size =  source_pb.len
215218
216219    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 :
221229            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'  )
222232
223-         if  dest_size ==  ZSTD_CONTENTSIZE_UNKNOWN and  dest is  None :
224-             return  stream_decompress(source_pb)
233+         dest_size =  < size_t> content_size
225234
226235        #  setup destination buffer
227236        if  dest is  None :
@@ -236,7 +245,7 @@ def decompress(source, dest=None):
236245        dest_ptr =  < char * > dest_pb.buf
237246        dest_nbytes =  dest_pb.len
238247
239-         if  dest_size  ==  ZSTD_CONTENTSIZE_UNKNOWN:
248+         if  content_size  ==  ZSTD_CONTENTSIZE_UNKNOWN:
240249            dest_size =  dest_nbytes
241250
242251        #  validate output buffer
0 commit comments