@@ -298,7 +298,30 @@ cdef class IgzipDecompressor:
298298 view_bitbuffer(& self .stream)
299299
300300 cdef unsigned char * decompress_buf(self , Py_ssize_t max_length):
301- return NULL
301+ cdef Py_ssize_t data_size = 0
302+ cdef unsigned char * obuf
303+ cdef Py_ssize_t obuflen = DEF_BUF_SIZE_I
304+ cdef int err
305+ if obuflen > max_length:
306+ obuflen = max_length
307+ while True :
308+ obuflen = arrange_output_buffer_with_maximum(& self .stream, & obuf, obuflen, max_length)
309+ if obuflen == - 1 :
310+ raise MemoryError (" Unsufficient memory for buffer allocation" )
311+ elif obuflen == - 2 :
312+ break
313+ err = isal_inflate(& self .stream)
314+ data_size = self .stream.next_out - obuf
315+ if err != ISAL_DECOMP_OK:
316+ check_isal_inflate_rc(err)
317+ if self .stream.block_state == ISAL_BLOCK_FINISH:
318+ break
319+ elif self .avail_in_real == 0 :
320+ break
321+ elif self .stream.avail_out == 0 :
322+ if data_size == max_length:
323+ break
324+ return obuf
302325
303326 def decompress (self , data , Py_ssize_t max_length = 0 ):
304327 """
@@ -330,15 +353,13 @@ cdef class IgzipDecompressor:
330353 cdef Py_ssize_t ibuflen = buffer .len
331354 cdef unsigned char * data_ptr = < unsigned char * > buffer .buf
332355
333- cdef int err
356+
334357 cdef bint max_length_reached = False
335358 cdef unsigned char * tmp
336359 cdef size_t offset
337360 # Initialise output buffer
338361 cdef unsigned char * obuf = NULL
339- cdef Py_ssize_t obuflen = DEF_BUF_SIZE_I
340- if obuflen > hard_limit:
341- obuflen = hard_limit
362+
342363 try :
343364 if self .stream.next_in != NULL :
344365 avail_now = (self .input_buffer + self .input_buffer_size) - \
@@ -365,7 +386,7 @@ cdef class IgzipDecompressor:
365386 self .avail_in_real = ibuflen
366387 input_buffer_in_use = 0
367388
368- obuf = self .decompress_buf(max_length )
389+ obuf = self .decompress_buf(hard_limit )
369390 if obuf == NULL :
370391 self .stream.next_in = NULL
371392 return b" "
0 commit comments