1 /* zlibmodule.c -- gzip-compatible data compression */
2 /* See http://zlib.net/ */
3 
4 /* Windows users:  read Python's PCbuild\readme.txt */
5 
6 #define PY_SSIZE_T_CLEAN
7 
8 #include "Python.h"
9 #include "structmember.h"         // PyMemberDef
10 #include "zlib.h"
11 
12 // Blocks output buffer wrappers
13 #include "pycore_blocks_output_buffer.h"
14 
15 #if OUTPUT_BUFFER_MAX_BLOCK_SIZE > UINT32_MAX
16     #error "The maximum block size accepted by zlib is UINT32_MAX."
17 #endif
18 
19 /* On success, return value >= 0
20    On failure, return -1 */
21 static inline Py_ssize_t
OutputBuffer_InitAndGrow(_BlocksOutputBuffer * buffer,Py_ssize_t max_length,Bytef ** next_out,uint32_t * avail_out)22 OutputBuffer_InitAndGrow(_BlocksOutputBuffer *buffer, Py_ssize_t max_length,
23                          Bytef **next_out, uint32_t *avail_out)
24 {
25     Py_ssize_t allocated;
26 
27     allocated = _BlocksOutputBuffer_InitAndGrow(
28                     buffer, max_length, (void**) next_out);
29     *avail_out = (uint32_t) allocated;
30     return allocated;
31 }
32 
33 /* On success, return value >= 0
34    On failure, return -1 */
35 static inline Py_ssize_t
OutputBuffer_Grow(_BlocksOutputBuffer * buffer,Bytef ** next_out,uint32_t * avail_out)36 OutputBuffer_Grow(_BlocksOutputBuffer *buffer,
37                   Bytef **next_out, uint32_t *avail_out)
38 {
39     Py_ssize_t allocated;
40 
41     allocated = _BlocksOutputBuffer_Grow(
42                     buffer, (void**) next_out, (Py_ssize_t) *avail_out);
43     *avail_out = (uint32_t) allocated;
44     return allocated;
45 }
46 
47 static inline Py_ssize_t
OutputBuffer_GetDataSize(_BlocksOutputBuffer * buffer,uint32_t avail_out)48 OutputBuffer_GetDataSize(_BlocksOutputBuffer *buffer, uint32_t avail_out)
49 {
50     return _BlocksOutputBuffer_GetDataSize(buffer, (Py_ssize_t) avail_out);
51 }
52 
53 static inline PyObject *
OutputBuffer_Finish(_BlocksOutputBuffer * buffer,uint32_t avail_out)54 OutputBuffer_Finish(_BlocksOutputBuffer *buffer, uint32_t avail_out)
55 {
56     return _BlocksOutputBuffer_Finish(buffer, (Py_ssize_t) avail_out);
57 }
58 
59 static inline void
OutputBuffer_OnError(_BlocksOutputBuffer * buffer)60 OutputBuffer_OnError(_BlocksOutputBuffer *buffer)
61 {
62     _BlocksOutputBuffer_OnError(buffer);
63 }
64 
65 /* The max buffer size accepted by zlib is UINT32_MAX, the initial buffer size
66    `init_size` may > it in 64-bit build. These wrapper functions maintain an
67    UINT32_MAX sliding window for the first block:
68     1. OutputBuffer_WindowInitWithSize()
69     2. OutputBuffer_WindowGrow()
70     3. OutputBuffer_WindowFinish()
71     4. OutputBuffer_WindowOnError()
72 
73    ==== is the sliding window:
74     1. ====------
75            ^ next_posi, left_bytes is 6
76     2. ----====--
77                ^ next_posi, left_bytes is 2
78     3. --------==
79                  ^ next_posi, left_bytes is 0  */
80 typedef struct {
81     Py_ssize_t left_bytes;
82     Bytef *next_posi;
83 } _Uint32Window;
84 
85 /* Initialize the buffer with an initial buffer size.
86 
87    On success, return value >= 0
88    On failure, return value < 0 */
89 static inline Py_ssize_t
OutputBuffer_WindowInitWithSize(_BlocksOutputBuffer * buffer,_Uint32Window * window,Py_ssize_t init_size,Bytef ** next_out,uint32_t * avail_out)90 OutputBuffer_WindowInitWithSize(_BlocksOutputBuffer *buffer, _Uint32Window *window,
91                                 Py_ssize_t init_size,
92                                 Bytef **next_out, uint32_t *avail_out)
93 {
94     Py_ssize_t allocated = _BlocksOutputBuffer_InitWithSize(
95                                buffer, init_size, (void**) next_out);
96 
97     if (allocated >= 0) {
98         // the UINT32_MAX sliding window
99         Py_ssize_t window_size = Py_MIN((size_t)allocated, UINT32_MAX);
100         *avail_out = (uint32_t) window_size;
101 
102         window->left_bytes = allocated - window_size;
103         window->next_posi = *next_out + window_size;
104     }
105     return allocated;
106 }
107 
108 /* Grow the buffer.
109 
110    On success, return value >= 0
111    On failure, return value < 0 */
112 static inline Py_ssize_t
OutputBuffer_WindowGrow(_BlocksOutputBuffer * buffer,_Uint32Window * window,Bytef ** next_out,uint32_t * avail_out)113 OutputBuffer_WindowGrow(_BlocksOutputBuffer *buffer, _Uint32Window *window,
114                         Bytef **next_out, uint32_t *avail_out)
115 {
116     Py_ssize_t allocated;
117 
118     /* ensure no gaps in the data.
119        if inlined, this check could be optimized away.*/
120     if (*avail_out != 0) {
121         PyErr_SetString(PyExc_SystemError,
122                         "*avail_out != 0 in OutputBuffer_WindowGrow().");
123         return -1;
124     }
125 
126     // slide the UINT32_MAX sliding window
127     if (window->left_bytes > 0) {
128         Py_ssize_t window_size = Py_MIN((size_t)window->left_bytes, UINT32_MAX);
129 
130         *next_out = window->next_posi;
131         *avail_out = (uint32_t) window_size;
132 
133         window->left_bytes -= window_size;
134         window->next_posi += window_size;
135 
136         return window_size;
137     }
138     assert(window->left_bytes == 0);
139 
140     // only the first block may > UINT32_MAX
141     allocated = _BlocksOutputBuffer_Grow(
142                     buffer, (void**) next_out, (Py_ssize_t) *avail_out);
143     *avail_out = (uint32_t) allocated;
144     return allocated;
145 }
146 
147 /* Finish the buffer.
148 
149    On success, return a bytes object
150    On failure, return NULL */
151 static inline PyObject *
OutputBuffer_WindowFinish(_BlocksOutputBuffer * buffer,_Uint32Window * window,uint32_t avail_out)152 OutputBuffer_WindowFinish(_BlocksOutputBuffer *buffer, _Uint32Window *window,
153                           uint32_t avail_out)
154 {
155     Py_ssize_t real_avail_out = (Py_ssize_t) avail_out + window->left_bytes;
156     return _BlocksOutputBuffer_Finish(buffer, real_avail_out);
157 }
158 
159 static inline void
OutputBuffer_WindowOnError(_BlocksOutputBuffer * buffer,_Uint32Window * window)160 OutputBuffer_WindowOnError(_BlocksOutputBuffer *buffer, _Uint32Window *window)
161 {
162     _BlocksOutputBuffer_OnError(buffer);
163 }
164 
165 
166 #define ENTER_ZLIB(obj) do {                      \
167     if (!PyThread_acquire_lock((obj)->lock, 0)) { \
168         Py_BEGIN_ALLOW_THREADS                    \
169         PyThread_acquire_lock((obj)->lock, 1);    \
170         Py_END_ALLOW_THREADS                      \
171     } } while (0)
172 #define LEAVE_ZLIB(obj) PyThread_release_lock((obj)->lock);
173 
174 #if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1221
175 #  define AT_LEAST_ZLIB_1_2_2_1
176 #endif
177 
178 /* The following parameters are copied from zutil.h, version 0.95 */
179 #define DEFLATED   8
180 #if MAX_MEM_LEVEL >= 8
181 #  define DEF_MEM_LEVEL 8
182 #else
183 #  define DEF_MEM_LEVEL  MAX_MEM_LEVEL
184 #endif
185 
186 /* Initial buffer size. */
187 #define DEF_BUF_SIZE (16*1024)
188 
189 static PyModuleDef zlibmodule;
190 
191 typedef struct {
192     PyTypeObject *Comptype;
193     PyTypeObject *Decomptype;
194     PyObject *ZlibError;
195 } zlibstate;
196 
197 static inline zlibstate*
get_zlib_state(PyObject * module)198 get_zlib_state(PyObject *module)
199 {
200     void *state = PyModule_GetState(module);
201     assert(state != NULL);
202     return (zlibstate *)state;
203 }
204 
205 typedef struct
206 {
207     PyObject_HEAD
208     z_stream zst;
209     PyObject *unused_data;
210     PyObject *unconsumed_tail;
211     char eof;
212     int is_initialised;
213     PyObject *zdict;
214     PyThread_type_lock lock;
215 } compobject;
216 
217 static void
zlib_error(zlibstate * state,z_stream zst,int err,const char * msg)218 zlib_error(zlibstate *state, z_stream zst, int err, const char *msg)
219 {
220     const char *zmsg = Z_NULL;
221     /* In case of a version mismatch, zst.msg won't be initialized.
222        Check for this case first, before looking at zst.msg. */
223     if (err == Z_VERSION_ERROR)
224         zmsg = "library version mismatch";
225     if (zmsg == Z_NULL)
226         zmsg = zst.msg;
227     if (zmsg == Z_NULL) {
228         switch (err) {
229         case Z_BUF_ERROR:
230             zmsg = "incomplete or truncated stream";
231             break;
232         case Z_STREAM_ERROR:
233             zmsg = "inconsistent stream state";
234             break;
235         case Z_DATA_ERROR:
236             zmsg = "invalid input data";
237             break;
238         }
239     }
240     if (zmsg == Z_NULL)
241         PyErr_Format(state->ZlibError, "Error %d %s", err, msg);
242     else
243         PyErr_Format(state->ZlibError, "Error %d %s: %.200s", err, msg, zmsg);
244 }
245 
246 /*[clinic input]
247 module zlib
248 class zlib.Compress "compobject *" "&Comptype"
249 class zlib.Decompress "compobject *" "&Decomptype"
250 [clinic start generated code]*/
251 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=093935115c3e3158]*/
252 
253 static compobject *
newcompobject(PyTypeObject * type)254 newcompobject(PyTypeObject *type)
255 {
256     compobject *self;
257     self = PyObject_New(compobject, type);
258     if (self == NULL)
259         return NULL;
260     self->eof = 0;
261     self->is_initialised = 0;
262     self->zdict = NULL;
263     self->unused_data = PyBytes_FromStringAndSize("", 0);
264     if (self->unused_data == NULL) {
265         Py_DECREF(self);
266         return NULL;
267     }
268     self->unconsumed_tail = PyBytes_FromStringAndSize("", 0);
269     if (self->unconsumed_tail == NULL) {
270         Py_DECREF(self);
271         return NULL;
272     }
273     self->lock = PyThread_allocate_lock();
274     if (self->lock == NULL) {
275         Py_DECREF(self);
276         PyErr_SetString(PyExc_MemoryError, "Unable to allocate lock");
277         return NULL;
278     }
279     return self;
280 }
281 
282 static void*
PyZlib_Malloc(voidpf ctx,uInt items,uInt size)283 PyZlib_Malloc(voidpf ctx, uInt items, uInt size)
284 {
285     if (size != 0 && items > (size_t)PY_SSIZE_T_MAX / size)
286         return NULL;
287     /* PyMem_Malloc() cannot be used: the GIL is not held when
288        inflate() and deflate() are called */
289     return PyMem_RawMalloc((size_t)items * (size_t)size);
290 }
291 
292 static void
PyZlib_Free(voidpf ctx,void * ptr)293 PyZlib_Free(voidpf ctx, void *ptr)
294 {
295     PyMem_RawFree(ptr);
296 }
297 
298 static void
arrange_input_buffer(z_stream * zst,Py_ssize_t * remains)299 arrange_input_buffer(z_stream *zst, Py_ssize_t *remains)
300 {
301     zst->avail_in = (uInt)Py_MIN((size_t)*remains, UINT_MAX);
302     *remains -= zst->avail_in;
303 }
304 
305 /*[clinic input]
306 zlib.compress
307 
308     data: Py_buffer
309         Binary data to be compressed.
310     /
311     level: int(c_default="Z_DEFAULT_COMPRESSION") = Z_DEFAULT_COMPRESSION
312         Compression level, in 0-9 or -1.
313     wbits: int(c_default="MAX_WBITS") = MAX_WBITS
314         The window buffer size and container format.
315 
316 Returns a bytes object containing compressed data.
317 [clinic start generated code]*/
318 
319 static PyObject *
zlib_compress_impl(PyObject * module,Py_buffer * data,int level,int wbits)320 zlib_compress_impl(PyObject *module, Py_buffer *data, int level, int wbits)
321 /*[clinic end generated code: output=46bd152fadd66df2 input=c4d06ee5782a7e3f]*/
322 {
323     PyObject *RetVal;
324     int flush;
325     z_stream zst;
326     _BlocksOutputBuffer buffer = {.list = NULL};
327 
328     zlibstate *state = get_zlib_state(module);
329 
330     Byte *ibuf = data->buf;
331     Py_ssize_t ibuflen = data->len;
332 
333     if (OutputBuffer_InitAndGrow(&buffer, -1, &zst.next_out, &zst.avail_out) < 0) {
334         goto error;
335     }
336 
337     zst.opaque = NULL;
338     zst.zalloc = PyZlib_Malloc;
339     zst.zfree = PyZlib_Free;
340     zst.next_in = ibuf;
341     int err = deflateInit2(&zst, level, DEFLATED, wbits, DEF_MEM_LEVEL,
342                            Z_DEFAULT_STRATEGY);
343 
344     switch (err) {
345     case Z_OK:
346         break;
347     case Z_MEM_ERROR:
348         PyErr_SetString(PyExc_MemoryError,
349                         "Out of memory while compressing data");
350         goto error;
351     case Z_STREAM_ERROR:
352         PyErr_SetString(state->ZlibError, "Bad compression level");
353         goto error;
354     default:
355         deflateEnd(&zst);
356         zlib_error(state, zst, err, "while compressing data");
357         goto error;
358     }
359 
360     do {
361         arrange_input_buffer(&zst, &ibuflen);
362         flush = ibuflen == 0 ? Z_FINISH : Z_NO_FLUSH;
363 
364         do {
365             if (zst.avail_out == 0) {
366                 if (OutputBuffer_Grow(&buffer, &zst.next_out, &zst.avail_out) < 0) {
367                     deflateEnd(&zst);
368                     goto error;
369                 }
370             }
371 
372             Py_BEGIN_ALLOW_THREADS
373             err = deflate(&zst, flush);
374             Py_END_ALLOW_THREADS
375 
376             if (err == Z_STREAM_ERROR) {
377                 deflateEnd(&zst);
378                 zlib_error(state, zst, err, "while compressing data");
379                 goto error;
380             }
381 
382         } while (zst.avail_out == 0);
383         assert(zst.avail_in == 0);
384 
385     } while (flush != Z_FINISH);
386     assert(err == Z_STREAM_END);
387 
388     err = deflateEnd(&zst);
389     if (err == Z_OK) {
390         RetVal = OutputBuffer_Finish(&buffer, zst.avail_out);
391         if (RetVal == NULL) {
392             goto error;
393         }
394         return RetVal;
395     }
396     else
397         zlib_error(state, zst, err, "while finishing compression");
398  error:
399     OutputBuffer_OnError(&buffer);
400     return NULL;
401 }
402 
403 /*[clinic input]
404 zlib.decompress
405 
406     data: Py_buffer
407         Compressed data.
408     /
409     wbits: int(c_default="MAX_WBITS") = MAX_WBITS
410         The window buffer size and container format.
411     bufsize: Py_ssize_t(c_default="DEF_BUF_SIZE") = DEF_BUF_SIZE
412         The initial output buffer size.
413 
414 Returns a bytes object containing the uncompressed data.
415 [clinic start generated code]*/
416 
417 static PyObject *
zlib_decompress_impl(PyObject * module,Py_buffer * data,int wbits,Py_ssize_t bufsize)418 zlib_decompress_impl(PyObject *module, Py_buffer *data, int wbits,
419                      Py_ssize_t bufsize)
420 /*[clinic end generated code: output=77c7e35111dc8c42 input=a9ac17beff1f893f]*/
421 {
422     PyObject *RetVal;
423     Byte *ibuf;
424     Py_ssize_t ibuflen;
425     int err, flush;
426     z_stream zst;
427     _BlocksOutputBuffer buffer = {.list = NULL};
428     _Uint32Window window;  // output buffer's UINT32_MAX sliding window
429 
430     zlibstate *state = get_zlib_state(module);
431 
432     if (bufsize < 0) {
433         PyErr_SetString(PyExc_ValueError, "bufsize must be non-negative");
434         return NULL;
435     } else if (bufsize == 0) {
436         bufsize = 1;
437     }
438 
439     if (OutputBuffer_WindowInitWithSize(&buffer, &window, bufsize,
440                                         &zst.next_out, &zst.avail_out) < 0) {
441         goto error;
442     }
443 
444     ibuf = data->buf;
445     ibuflen = data->len;
446 
447     zst.opaque = NULL;
448     zst.zalloc = PyZlib_Malloc;
449     zst.zfree = PyZlib_Free;
450     zst.avail_in = 0;
451     zst.next_in = ibuf;
452     err = inflateInit2(&zst, wbits);
453 
454     switch (err) {
455     case Z_OK:
456         break;
457     case Z_MEM_ERROR:
458         PyErr_SetString(PyExc_MemoryError,
459                         "Out of memory while decompressing data");
460         goto error;
461     default:
462         inflateEnd(&zst);
463         zlib_error(state, zst, err, "while preparing to decompress data");
464         goto error;
465     }
466 
467     do {
468         arrange_input_buffer(&zst, &ibuflen);
469         flush = ibuflen == 0 ? Z_FINISH : Z_NO_FLUSH;
470 
471         do {
472             if (zst.avail_out == 0) {
473                 if (OutputBuffer_WindowGrow(&buffer, &window,
474                                             &zst.next_out, &zst.avail_out) < 0) {
475                     inflateEnd(&zst);
476                     goto error;
477                 }
478             }
479 
480             Py_BEGIN_ALLOW_THREADS
481             err = inflate(&zst, flush);
482             Py_END_ALLOW_THREADS
483 
484             switch (err) {
485             case Z_OK:            /* fall through */
486             case Z_BUF_ERROR:     /* fall through */
487             case Z_STREAM_END:
488                 break;
489             case Z_MEM_ERROR:
490                 inflateEnd(&zst);
491                 PyErr_SetString(PyExc_MemoryError,
492                                 "Out of memory while decompressing data");
493                 goto error;
494             default:
495                 inflateEnd(&zst);
496                 zlib_error(state, zst, err, "while decompressing data");
497                 goto error;
498             }
499 
500         } while (zst.avail_out == 0);
501 
502     } while (err != Z_STREAM_END && ibuflen != 0);
503 
504 
505     if (err != Z_STREAM_END) {
506         inflateEnd(&zst);
507         zlib_error(state, zst, err, "while decompressing data");
508         goto error;
509     }
510 
511     err = inflateEnd(&zst);
512     if (err != Z_OK) {
513         zlib_error(state, zst, err, "while finishing decompression");
514         goto error;
515     }
516 
517     RetVal = OutputBuffer_WindowFinish(&buffer, &window, zst.avail_out);
518     if (RetVal != NULL) {
519         return RetVal;
520     }
521 
522  error:
523     OutputBuffer_WindowOnError(&buffer, &window);
524     return NULL;
525 }
526 
527 /*[clinic input]
528 zlib.compressobj
529 
530     level: int(c_default="Z_DEFAULT_COMPRESSION") = Z_DEFAULT_COMPRESSION
531         The compression level (an integer in the range 0-9 or -1; default is
532         currently equivalent to 6).  Higher compression levels are slower,
533         but produce smaller results.
534     method: int(c_default="DEFLATED") = DEFLATED
535         The compression algorithm.  If given, this must be DEFLATED.
536     wbits: int(c_default="MAX_WBITS") = MAX_WBITS
537         +9 to +15: The base-two logarithm of the window size.  Include a zlib
538             container.
539         -9 to -15: Generate a raw stream.
540         +25 to +31: Include a gzip container.
541     memLevel: int(c_default="DEF_MEM_LEVEL") = DEF_MEM_LEVEL
542         Controls the amount of memory used for internal compression state.
543         Valid values range from 1 to 9.  Higher values result in higher memory
544         usage, faster compression, and smaller output.
545     strategy: int(c_default="Z_DEFAULT_STRATEGY") = Z_DEFAULT_STRATEGY
546         Used to tune the compression algorithm.  Possible values are
547         Z_DEFAULT_STRATEGY, Z_FILTERED, and Z_HUFFMAN_ONLY.
548     zdict: Py_buffer = None
549         The predefined compression dictionary - a sequence of bytes
550         containing subsequences that are likely to occur in the input data.
551 
552 Return a compressor object.
553 [clinic start generated code]*/
554 
555 static PyObject *
zlib_compressobj_impl(PyObject * module,int level,int method,int wbits,int memLevel,int strategy,Py_buffer * zdict)556 zlib_compressobj_impl(PyObject *module, int level, int method, int wbits,
557                       int memLevel, int strategy, Py_buffer *zdict)
558 /*[clinic end generated code: output=8b5bed9c8fc3814d input=2fa3d026f90ab8d5]*/
559 {
560     zlibstate *state = get_zlib_state(module);
561     if (zdict->buf != NULL && (size_t)zdict->len > UINT_MAX) {
562         PyErr_SetString(PyExc_OverflowError,
563                         "zdict length does not fit in an unsigned int");
564         return NULL;
565     }
566 
567     compobject *self = newcompobject(state->Comptype);
568     if (self == NULL)
569         goto error;
570     self->zst.opaque = NULL;
571     self->zst.zalloc = PyZlib_Malloc;
572     self->zst.zfree = PyZlib_Free;
573     self->zst.next_in = NULL;
574     self->zst.avail_in = 0;
575     int err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
576     switch (err) {
577     case Z_OK:
578         self->is_initialised = 1;
579         if (zdict->buf == NULL) {
580             goto success;
581         } else {
582             err = deflateSetDictionary(&self->zst,
583                                        zdict->buf, (unsigned int)zdict->len);
584             switch (err) {
585             case Z_OK:
586                 goto success;
587             case Z_STREAM_ERROR:
588                 PyErr_SetString(PyExc_ValueError, "Invalid dictionary");
589                 goto error;
590             default:
591                 PyErr_SetString(PyExc_ValueError, "deflateSetDictionary()");
592                 goto error;
593             }
594        }
595     case Z_MEM_ERROR:
596         PyErr_SetString(PyExc_MemoryError,
597                         "Can't allocate memory for compression object");
598         goto error;
599     case Z_STREAM_ERROR:
600         PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
601         goto error;
602     default:
603         zlib_error(state, self->zst, err, "while creating compression object");
604         goto error;
605     }
606 
607  error:
608     Py_CLEAR(self);
609  success:
610     return (PyObject *)self;
611 }
612 
613 static int
set_inflate_zdict(zlibstate * state,compobject * self)614 set_inflate_zdict(zlibstate *state, compobject *self)
615 {
616     Py_buffer zdict_buf;
617     if (PyObject_GetBuffer(self->zdict, &zdict_buf, PyBUF_SIMPLE) == -1) {
618         return -1;
619     }
620     if ((size_t)zdict_buf.len > UINT_MAX) {
621         PyErr_SetString(PyExc_OverflowError,
622                         "zdict length does not fit in an unsigned int");
623         PyBuffer_Release(&zdict_buf);
624         return -1;
625     }
626     int err;
627     err = inflateSetDictionary(&self->zst,
628                                zdict_buf.buf, (unsigned int)zdict_buf.len);
629     PyBuffer_Release(&zdict_buf);
630     if (err != Z_OK) {
631         zlib_error(state, self->zst, err, "while setting zdict");
632         return -1;
633     }
634     return 0;
635 }
636 
637 /*[clinic input]
638 zlib.decompressobj
639 
640     wbits: int(c_default="MAX_WBITS") = MAX_WBITS
641         The window buffer size and container format.
642     zdict: object(c_default="NULL") = b''
643         The predefined compression dictionary.  This must be the same
644         dictionary as used by the compressor that produced the input data.
645 
646 Return a decompressor object.
647 [clinic start generated code]*/
648 
649 static PyObject *
zlib_decompressobj_impl(PyObject * module,int wbits,PyObject * zdict)650 zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict)
651 /*[clinic end generated code: output=3069b99994f36906 input=d3832b8511fc977b]*/
652 {
653     zlibstate *state = get_zlib_state(module);
654 
655     if (zdict != NULL && !PyObject_CheckBuffer(zdict)) {
656         PyErr_SetString(PyExc_TypeError,
657                         "zdict argument must support the buffer protocol");
658         return NULL;
659     }
660 
661     compobject *self = newcompobject(state->Decomptype);
662     if (self == NULL)
663         return NULL;
664     self->zst.opaque = NULL;
665     self->zst.zalloc = PyZlib_Malloc;
666     self->zst.zfree = PyZlib_Free;
667     self->zst.next_in = NULL;
668     self->zst.avail_in = 0;
669     if (zdict != NULL) {
670         Py_INCREF(zdict);
671         self->zdict = zdict;
672     }
673     int err = inflateInit2(&self->zst, wbits);
674     switch (err) {
675     case Z_OK:
676         self->is_initialised = 1;
677         if (self->zdict != NULL && wbits < 0) {
678 #ifdef AT_LEAST_ZLIB_1_2_2_1
679             if (set_inflate_zdict(state, self) < 0) {
680                 Py_DECREF(self);
681                 return NULL;
682             }
683 #else
684             PyErr_Format(state->ZlibError,
685                          "zlib version %s does not allow raw inflate with dictionary",
686                          ZLIB_VERSION);
687             Py_DECREF(self);
688             return NULL;
689 #endif
690         }
691         return (PyObject *)self;
692     case Z_STREAM_ERROR:
693         Py_DECREF(self);
694         PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
695         return NULL;
696     case Z_MEM_ERROR:
697         Py_DECREF(self);
698         PyErr_SetString(PyExc_MemoryError,
699                         "Can't allocate memory for decompression object");
700         return NULL;
701     default:
702         zlib_error(state, self->zst, err, "while creating decompression object");
703         Py_DECREF(self);
704         return NULL;
705     }
706 }
707 
708 static void
Dealloc(compobject * self)709 Dealloc(compobject *self)
710 {
711     PyObject *type = (PyObject *)Py_TYPE(self);
712     PyThread_free_lock(self->lock);
713     Py_XDECREF(self->unused_data);
714     Py_XDECREF(self->unconsumed_tail);
715     Py_XDECREF(self->zdict);
716     PyObject_Free(self);
717     Py_DECREF(type);
718 }
719 
720 static void
Comp_dealloc(compobject * self)721 Comp_dealloc(compobject *self)
722 {
723     if (self->is_initialised)
724         deflateEnd(&self->zst);
725     Dealloc(self);
726 }
727 
728 static void
Decomp_dealloc(compobject * self)729 Decomp_dealloc(compobject *self)
730 {
731     if (self->is_initialised)
732         inflateEnd(&self->zst);
733     Dealloc(self);
734 }
735 
736 /*[clinic input]
737 zlib.Compress.compress
738 
739     cls: defining_class
740     data: Py_buffer
741         Binary data to be compressed.
742     /
743 
744 Returns a bytes object containing compressed data.
745 
746 After calling this function, some of the input data may still
747 be stored in internal buffers for later processing.
748 Call the flush() method to clear these buffers.
749 [clinic start generated code]*/
750 
751 static PyObject *
zlib_Compress_compress_impl(compobject * self,PyTypeObject * cls,Py_buffer * data)752 zlib_Compress_compress_impl(compobject *self, PyTypeObject *cls,
753                             Py_buffer *data)
754 /*[clinic end generated code: output=6731b3f0ff357ca6 input=04d00f65ab01d260]*/
755 {
756     PyObject *RetVal;
757     int err;
758     _BlocksOutputBuffer buffer = {.list = NULL};
759     zlibstate *state = PyType_GetModuleState(cls);
760 
761     ENTER_ZLIB(self);
762 
763     self->zst.next_in = data->buf;
764     Py_ssize_t ibuflen = data->len;
765 
766     if (OutputBuffer_InitAndGrow(&buffer, -1, &self->zst.next_out, &self->zst.avail_out) < 0) {
767         goto error;
768     }
769 
770     do {
771         arrange_input_buffer(&self->zst, &ibuflen);
772 
773         do {
774             if (self->zst.avail_out == 0) {
775                 if (OutputBuffer_Grow(&buffer, &self->zst.next_out, &self->zst.avail_out) < 0) {
776                     goto error;
777                 }
778             }
779 
780             Py_BEGIN_ALLOW_THREADS
781             err = deflate(&self->zst, Z_NO_FLUSH);
782             Py_END_ALLOW_THREADS
783 
784             if (err == Z_STREAM_ERROR) {
785                 zlib_error(state, self->zst, err, "while compressing data");
786                 goto error;
787             }
788 
789         } while (self->zst.avail_out == 0);
790         assert(self->zst.avail_in == 0);
791 
792     } while (ibuflen != 0);
793 
794     RetVal = OutputBuffer_Finish(&buffer, self->zst.avail_out);
795     if (RetVal != NULL) {
796         goto success;
797     }
798 
799  error:
800     OutputBuffer_OnError(&buffer);
801     RetVal = NULL;
802  success:
803     LEAVE_ZLIB(self);
804     return RetVal;
805 }
806 
807 /* Helper for objdecompress() and flush(). Saves any unconsumed input data in
808    self->unused_data or self->unconsumed_tail, as appropriate. */
809 static int
save_unconsumed_input(compobject * self,Py_buffer * data,int err)810 save_unconsumed_input(compobject *self, Py_buffer *data, int err)
811 {
812     if (err == Z_STREAM_END) {
813         /* The end of the compressed data has been reached. Store the leftover
814            input data in self->unused_data. */
815         if (self->zst.avail_in > 0) {
816             Py_ssize_t old_size = PyBytes_GET_SIZE(self->unused_data);
817             Py_ssize_t new_size, left_size;
818             PyObject *new_data;
819             left_size = (Byte *)data->buf + data->len - self->zst.next_in;
820             if (left_size > (PY_SSIZE_T_MAX - old_size)) {
821                 PyErr_NoMemory();
822                 return -1;
823             }
824             new_size = old_size + left_size;
825             new_data = PyBytes_FromStringAndSize(NULL, new_size);
826             if (new_data == NULL)
827                 return -1;
828             memcpy(PyBytes_AS_STRING(new_data),
829                       PyBytes_AS_STRING(self->unused_data), old_size);
830             memcpy(PyBytes_AS_STRING(new_data) + old_size,
831                       self->zst.next_in, left_size);
832             Py_SETREF(self->unused_data, new_data);
833             self->zst.avail_in = 0;
834         }
835     }
836 
837     if (self->zst.avail_in > 0 || PyBytes_GET_SIZE(self->unconsumed_tail)) {
838         /* This code handles two distinct cases:
839            1. Output limit was reached. Save leftover input in unconsumed_tail.
840            2. All input data was consumed. Clear unconsumed_tail. */
841         Py_ssize_t left_size = (Byte *)data->buf + data->len - self->zst.next_in;
842         PyObject *new_data = PyBytes_FromStringAndSize(
843                 (char *)self->zst.next_in, left_size);
844         if (new_data == NULL)
845             return -1;
846         Py_SETREF(self->unconsumed_tail, new_data);
847     }
848 
849     return 0;
850 }
851 
852 /*[clinic input]
853 zlib.Decompress.decompress
854 
855     cls: defining_class
856     data: Py_buffer
857         The binary data to decompress.
858     /
859     max_length: Py_ssize_t = 0
860         The maximum allowable length of the decompressed data.
861         Unconsumed input data will be stored in
862         the unconsumed_tail attribute.
863 
864 Return a bytes object containing the decompressed version of the data.
865 
866 After calling this function, some of the input data may still be stored in
867 internal buffers for later processing.
868 Call the flush() method to clear these buffers.
869 [clinic start generated code]*/
870 
871 static PyObject *
zlib_Decompress_decompress_impl(compobject * self,PyTypeObject * cls,Py_buffer * data,Py_ssize_t max_length)872 zlib_Decompress_decompress_impl(compobject *self, PyTypeObject *cls,
873                                 Py_buffer *data, Py_ssize_t max_length)
874 /*[clinic end generated code: output=b024a93c2c922d57 input=bfb37b3864cfb606]*/
875 {
876     int err = Z_OK;
877     Py_ssize_t ibuflen;
878     PyObject *RetVal;
879     _BlocksOutputBuffer buffer = {.list = NULL};
880 
881     PyObject *module = PyType_GetModule(cls);
882     if (module == NULL)
883         return NULL;
884 
885     zlibstate *state = get_zlib_state(module);
886     if (max_length < 0) {
887         PyErr_SetString(PyExc_ValueError, "max_length must be non-negative");
888         return NULL;
889     } else if (max_length == 0) {
890         max_length = -1;
891     }
892 
893     ENTER_ZLIB(self);
894 
895     self->zst.next_in = data->buf;
896     ibuflen = data->len;
897 
898     if (OutputBuffer_InitAndGrow(&buffer, max_length, &self->zst.next_out, &self->zst.avail_out) < 0) {
899         goto abort;
900     }
901 
902     do {
903         arrange_input_buffer(&self->zst, &ibuflen);
904 
905         do {
906             if (self->zst.avail_out == 0) {
907                 if (OutputBuffer_GetDataSize(&buffer, self->zst.avail_out) == max_length) {
908                     goto save;
909                 }
910                 if (OutputBuffer_Grow(&buffer, &self->zst.next_out, &self->zst.avail_out) < 0) {
911                     goto abort;
912                 }
913             }
914 
915             Py_BEGIN_ALLOW_THREADS
916             err = inflate(&self->zst, Z_SYNC_FLUSH);
917             Py_END_ALLOW_THREADS
918 
919             switch (err) {
920             case Z_OK:            /* fall through */
921             case Z_BUF_ERROR:     /* fall through */
922             case Z_STREAM_END:
923                 break;
924             default:
925                 if (err == Z_NEED_DICT && self->zdict != NULL) {
926                     if (set_inflate_zdict(state, self) < 0) {
927                         goto abort;
928                     }
929                     else
930                         break;
931                 }
932                 goto save;
933             }
934 
935         } while (self->zst.avail_out == 0 || err == Z_NEED_DICT);
936 
937     } while (err != Z_STREAM_END && ibuflen != 0);
938 
939  save:
940     if (save_unconsumed_input(self, data, err) < 0)
941         goto abort;
942 
943     if (err == Z_STREAM_END) {
944         /* This is the logical place to call inflateEnd, but the old behaviour
945            of only calling it on flush() is preserved. */
946         self->eof = 1;
947     } else if (err != Z_OK && err != Z_BUF_ERROR) {
948         /* We will only get Z_BUF_ERROR if the output buffer was full
949            but there wasn't more output when we tried again, so it is
950            not an error condition.
951         */
952         zlib_error(state, self->zst, err, "while decompressing data");
953         goto abort;
954     }
955 
956     RetVal = OutputBuffer_Finish(&buffer, self->zst.avail_out);
957     if (RetVal != NULL) {
958         goto success;
959     }
960 
961  abort:
962     OutputBuffer_OnError(&buffer);
963     RetVal = NULL;
964  success:
965     LEAVE_ZLIB(self);
966     return RetVal;
967 }
968 
969 /*[clinic input]
970 zlib.Compress.flush
971 
972     cls: defining_class
973     mode: int(c_default="Z_FINISH") = zlib.Z_FINISH
974         One of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH.
975         If mode == Z_FINISH, the compressor object can no longer be
976         used after calling the flush() method.  Otherwise, more data
977         can still be compressed.
978     /
979 
980 Return a bytes object containing any remaining compressed data.
981 [clinic start generated code]*/
982 
983 static PyObject *
zlib_Compress_flush_impl(compobject * self,PyTypeObject * cls,int mode)984 zlib_Compress_flush_impl(compobject *self, PyTypeObject *cls, int mode)
985 /*[clinic end generated code: output=c7efd13efd62add2 input=286146e29442eb6c]*/
986 {
987     int err;
988     PyObject *RetVal;
989     _BlocksOutputBuffer buffer = {.list = NULL};
990 
991     zlibstate *state = PyType_GetModuleState(cls);
992     /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
993        doing any work at all; just return an empty string. */
994     if (mode == Z_NO_FLUSH) {
995         return PyBytes_FromStringAndSize(NULL, 0);
996     }
997 
998     ENTER_ZLIB(self);
999 
1000     self->zst.avail_in = 0;
1001 
1002     if (OutputBuffer_InitAndGrow(&buffer, -1, &self->zst.next_out, &self->zst.avail_out) < 0) {
1003         goto error;
1004     }
1005 
1006     do {
1007         if (self->zst.avail_out == 0) {
1008             if (OutputBuffer_Grow(&buffer, &self->zst.next_out, &self->zst.avail_out) < 0) {
1009                 goto error;
1010             }
1011         }
1012 
1013         Py_BEGIN_ALLOW_THREADS
1014         err = deflate(&self->zst, mode);
1015         Py_END_ALLOW_THREADS
1016 
1017         if (err == Z_STREAM_ERROR) {
1018             zlib_error(state, self->zst, err, "while flushing");
1019             goto error;
1020         }
1021     } while (self->zst.avail_out == 0);
1022     assert(self->zst.avail_in == 0);
1023 
1024     /* If mode is Z_FINISH, we also have to call deflateEnd() to free
1025        various data structures. Note we should only get Z_STREAM_END when
1026        mode is Z_FINISH, but checking both for safety*/
1027     if (err == Z_STREAM_END && mode == Z_FINISH) {
1028         err = deflateEnd(&self->zst);
1029         if (err != Z_OK) {
1030             zlib_error(state, self->zst, err, "while finishing compression");
1031             goto error;
1032         }
1033         else
1034             self->is_initialised = 0;
1035 
1036         /* We will only get Z_BUF_ERROR if the output buffer was full
1037            but there wasn't more output when we tried again, so it is
1038            not an error condition.
1039         */
1040     } else if (err != Z_OK && err != Z_BUF_ERROR) {
1041         zlib_error(state, self->zst, err, "while flushing");
1042         goto error;
1043     }
1044 
1045     RetVal = OutputBuffer_Finish(&buffer, self->zst.avail_out);
1046     if (RetVal != NULL) {
1047         goto success;
1048     }
1049 
1050 error:
1051     OutputBuffer_OnError(&buffer);
1052     RetVal = NULL;
1053 success:
1054     LEAVE_ZLIB(self);
1055     return RetVal;
1056 }
1057 
1058 #ifdef HAVE_ZLIB_COPY
1059 
1060 /*[clinic input]
1061 zlib.Compress.copy
1062 
1063     cls: defining_class
1064 
1065 Return a copy of the compression object.
1066 [clinic start generated code]*/
1067 
1068 static PyObject *
zlib_Compress_copy_impl(compobject * self,PyTypeObject * cls)1069 zlib_Compress_copy_impl(compobject *self, PyTypeObject *cls)
1070 /*[clinic end generated code: output=c4d2cfb4b0d7350b input=235497e482d40986]*/
1071 {
1072     zlibstate *state = PyType_GetModuleState(cls);
1073 
1074     compobject *retval = newcompobject(state->Comptype);
1075     if (!retval) return NULL;
1076 
1077     /* Copy the zstream state
1078      * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
1079      */
1080     ENTER_ZLIB(self);
1081     int err = deflateCopy(&retval->zst, &self->zst);
1082     switch (err) {
1083     case Z_OK:
1084         break;
1085     case Z_STREAM_ERROR:
1086         PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
1087         goto error;
1088     case Z_MEM_ERROR:
1089         PyErr_SetString(PyExc_MemoryError,
1090                         "Can't allocate memory for compression object");
1091         goto error;
1092     default:
1093         zlib_error(state, self->zst, err, "while copying compression object");
1094         goto error;
1095     }
1096     Py_INCREF(self->unused_data);
1097     Py_XSETREF(retval->unused_data, self->unused_data);
1098     Py_INCREF(self->unconsumed_tail);
1099     Py_XSETREF(retval->unconsumed_tail, self->unconsumed_tail);
1100     Py_XINCREF(self->zdict);
1101     Py_XSETREF(retval->zdict, self->zdict);
1102     retval->eof = self->eof;
1103 
1104     /* Mark it as being initialized */
1105     retval->is_initialised = 1;
1106 
1107     LEAVE_ZLIB(self);
1108     return (PyObject *)retval;
1109 
1110 error:
1111     LEAVE_ZLIB(self);
1112     Py_XDECREF(retval);
1113     return NULL;
1114 }
1115 
1116 /*[clinic input]
1117 zlib.Compress.__copy__
1118 
1119     cls: defining_class
1120 
1121 [clinic start generated code]*/
1122 
1123 static PyObject *
zlib_Compress___copy___impl(compobject * self,PyTypeObject * cls)1124 zlib_Compress___copy___impl(compobject *self, PyTypeObject *cls)
1125 /*[clinic end generated code: output=074613db332cb668 input=5c0188367ab0fe64]*/
1126 {
1127     return zlib_Compress_copy_impl(self, cls);
1128 }
1129 
1130 /*[clinic input]
1131 zlib.Compress.__deepcopy__
1132 
1133     cls: defining_class
1134     memo: object
1135     /
1136 
1137 [clinic start generated code]*/
1138 
1139 static PyObject *
zlib_Compress___deepcopy___impl(compobject * self,PyTypeObject * cls,PyObject * memo)1140 zlib_Compress___deepcopy___impl(compobject *self, PyTypeObject *cls,
1141                                 PyObject *memo)
1142 /*[clinic end generated code: output=24b3aed785f54033 input=c90347319a514430]*/
1143 {
1144     return zlib_Compress_copy_impl(self, cls);
1145 }
1146 
1147 /*[clinic input]
1148 zlib.Decompress.copy
1149 
1150     cls: defining_class
1151 
1152 Return a copy of the decompression object.
1153 [clinic start generated code]*/
1154 
1155 static PyObject *
zlib_Decompress_copy_impl(compobject * self,PyTypeObject * cls)1156 zlib_Decompress_copy_impl(compobject *self, PyTypeObject *cls)
1157 /*[clinic end generated code: output=a7ddc016e1d0a781 input=20ef3aa208282ff2]*/
1158 {
1159     zlibstate *state = PyType_GetModuleState(cls);
1160 
1161     compobject *retval = newcompobject(state->Decomptype);
1162     if (!retval) return NULL;
1163 
1164     /* Copy the zstream state
1165      * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
1166      */
1167     ENTER_ZLIB(self);
1168     int err = inflateCopy(&retval->zst, &self->zst);
1169     switch (err) {
1170     case Z_OK:
1171         break;
1172     case Z_STREAM_ERROR:
1173         PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
1174         goto error;
1175     case Z_MEM_ERROR:
1176         PyErr_SetString(PyExc_MemoryError,
1177                         "Can't allocate memory for decompression object");
1178         goto error;
1179     default:
1180         zlib_error(state, self->zst, err, "while copying decompression object");
1181         goto error;
1182     }
1183 
1184     Py_INCREF(self->unused_data);
1185     Py_XSETREF(retval->unused_data, self->unused_data);
1186     Py_INCREF(self->unconsumed_tail);
1187     Py_XSETREF(retval->unconsumed_tail, self->unconsumed_tail);
1188     Py_XINCREF(self->zdict);
1189     Py_XSETREF(retval->zdict, self->zdict);
1190     retval->eof = self->eof;
1191 
1192     /* Mark it as being initialized */
1193     retval->is_initialised = 1;
1194 
1195     LEAVE_ZLIB(self);
1196     return (PyObject *)retval;
1197 
1198 error:
1199     LEAVE_ZLIB(self);
1200     Py_XDECREF(retval);
1201     return NULL;
1202 }
1203 
1204 /*[clinic input]
1205 zlib.Decompress.__copy__
1206 
1207     cls: defining_class
1208 
1209 [clinic start generated code]*/
1210 
1211 static PyObject *
zlib_Decompress___copy___impl(compobject * self,PyTypeObject * cls)1212 zlib_Decompress___copy___impl(compobject *self, PyTypeObject *cls)
1213 /*[clinic end generated code: output=cf1e6473744f53fa input=cc3143067b622bdf]*/
1214 {
1215     return zlib_Decompress_copy_impl(self, cls);
1216 }
1217 
1218 /*[clinic input]
1219 zlib.Decompress.__deepcopy__
1220 
1221     cls: defining_class
1222     memo: object
1223     /
1224 
1225 [clinic start generated code]*/
1226 
1227 static PyObject *
zlib_Decompress___deepcopy___impl(compobject * self,PyTypeObject * cls,PyObject * memo)1228 zlib_Decompress___deepcopy___impl(compobject *self, PyTypeObject *cls,
1229                                   PyObject *memo)
1230 /*[clinic end generated code: output=34f7b719a0c0d51b input=fc13b9c58622544e]*/
1231 {
1232     return zlib_Decompress_copy_impl(self, cls);
1233 }
1234 
1235 #endif
1236 
1237 /*[clinic input]
1238 zlib.Decompress.flush
1239 
1240     cls: defining_class
1241     length: Py_ssize_t(c_default="DEF_BUF_SIZE") = zlib.DEF_BUF_SIZE
1242         the initial size of the output buffer.
1243     /
1244 
1245 Return a bytes object containing any remaining decompressed data.
1246 [clinic start generated code]*/
1247 
1248 static PyObject *
zlib_Decompress_flush_impl(compobject * self,PyTypeObject * cls,Py_ssize_t length)1249 zlib_Decompress_flush_impl(compobject *self, PyTypeObject *cls,
1250                            Py_ssize_t length)
1251 /*[clinic end generated code: output=4532fc280bd0f8f2 input=42f1f4b75230e2cd]*/
1252 {
1253     int err, flush;
1254     Py_buffer data;
1255     PyObject *RetVal;
1256     Py_ssize_t ibuflen;
1257     _BlocksOutputBuffer buffer = {.list = NULL};
1258     _Uint32Window window;  // output buffer's UINT32_MAX sliding window
1259 
1260     PyObject *module = PyType_GetModule(cls);
1261     if (module == NULL) {
1262         return NULL;
1263     }
1264 
1265     zlibstate *state = get_zlib_state(module);
1266 
1267     if (length <= 0) {
1268         PyErr_SetString(PyExc_ValueError, "length must be greater than zero");
1269         return NULL;
1270     }
1271 
1272     ENTER_ZLIB(self);
1273 
1274     if (PyObject_GetBuffer(self->unconsumed_tail, &data, PyBUF_SIMPLE) == -1) {
1275         LEAVE_ZLIB(self);
1276         return NULL;
1277     }
1278 
1279     self->zst.next_in = data.buf;
1280     ibuflen = data.len;
1281 
1282     if (OutputBuffer_WindowInitWithSize(&buffer, &window, length,
1283                                         &self->zst.next_out, &self->zst.avail_out) < 0) {
1284         goto abort;
1285     }
1286 
1287     do {
1288         arrange_input_buffer(&self->zst, &ibuflen);
1289         flush = ibuflen == 0 ? Z_FINISH : Z_NO_FLUSH;
1290 
1291         do {
1292             if (self->zst.avail_out == 0) {
1293                 if (OutputBuffer_WindowGrow(&buffer, &window,
1294                                             &self->zst.next_out, &self->zst.avail_out) < 0) {
1295                     goto abort;
1296                 }
1297             }
1298 
1299             Py_BEGIN_ALLOW_THREADS
1300             err = inflate(&self->zst, flush);
1301             Py_END_ALLOW_THREADS
1302 
1303             switch (err) {
1304             case Z_OK:            /* fall through */
1305             case Z_BUF_ERROR:     /* fall through */
1306             case Z_STREAM_END:
1307                 break;
1308             default:
1309                 if (err == Z_NEED_DICT && self->zdict != NULL) {
1310                     if (set_inflate_zdict(state, self) < 0) {
1311                         goto abort;
1312                     }
1313                     else
1314                         break;
1315                 }
1316                 goto save;
1317             }
1318 
1319         } while (self->zst.avail_out == 0 || err == Z_NEED_DICT);
1320 
1321     } while (err != Z_STREAM_END && ibuflen != 0);
1322 
1323  save:
1324     if (save_unconsumed_input(self, &data, err) < 0) {
1325         goto abort;
1326     }
1327 
1328     /* If at end of stream, clean up any memory allocated by zlib. */
1329     if (err == Z_STREAM_END) {
1330         self->eof = 1;
1331         self->is_initialised = 0;
1332         err = inflateEnd(&self->zst);
1333         if (err != Z_OK) {
1334             zlib_error(state, self->zst, err, "while finishing decompression");
1335             goto abort;
1336         }
1337     }
1338 
1339     RetVal = OutputBuffer_WindowFinish(&buffer, &window, self->zst.avail_out);
1340     if (RetVal != NULL) {
1341         goto success;
1342     }
1343 
1344  abort:
1345     OutputBuffer_WindowOnError(&buffer, &window);
1346     RetVal = NULL;
1347  success:
1348     PyBuffer_Release(&data);
1349     LEAVE_ZLIB(self);
1350     return RetVal;
1351 }
1352 
1353 #include "clinic/zlibmodule.c.h"
1354 
1355 static PyMethodDef comp_methods[] =
1356 {
1357     ZLIB_COMPRESS_COMPRESS_METHODDEF
1358     ZLIB_COMPRESS_FLUSH_METHODDEF
1359     ZLIB_COMPRESS_COPY_METHODDEF
1360     ZLIB_COMPRESS___COPY___METHODDEF
1361     ZLIB_COMPRESS___DEEPCOPY___METHODDEF
1362     {NULL, NULL}
1363 };
1364 
1365 static PyMethodDef Decomp_methods[] =
1366 {
1367     ZLIB_DECOMPRESS_DECOMPRESS_METHODDEF
1368     ZLIB_DECOMPRESS_FLUSH_METHODDEF
1369     ZLIB_DECOMPRESS_COPY_METHODDEF
1370     ZLIB_DECOMPRESS___COPY___METHODDEF
1371     ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF
1372     {NULL, NULL}
1373 };
1374 
1375 #define COMP_OFF(x) offsetof(compobject, x)
1376 static PyMemberDef Decomp_members[] = {
1377     {"unused_data",     T_OBJECT, COMP_OFF(unused_data), READONLY},
1378     {"unconsumed_tail", T_OBJECT, COMP_OFF(unconsumed_tail), READONLY},
1379     {"eof",             T_BOOL,   COMP_OFF(eof), READONLY},
1380     {NULL},
1381 };
1382 
1383 /*[clinic input]
1384 zlib.adler32
1385 
1386     data: Py_buffer
1387     value: unsigned_int(bitwise=True) = 1
1388         Starting value of the checksum.
1389     /
1390 
1391 Compute an Adler-32 checksum of data.
1392 
1393 The returned checksum is an integer.
1394 [clinic start generated code]*/
1395 
1396 static PyObject *
zlib_adler32_impl(PyObject * module,Py_buffer * data,unsigned int value)1397 zlib_adler32_impl(PyObject *module, Py_buffer *data, unsigned int value)
1398 /*[clinic end generated code: output=422106f5ca8c92c0 input=6ff4557872160e88]*/
1399 {
1400     /* Releasing the GIL for very small buffers is inefficient
1401        and may lower performance */
1402     if (data->len > 1024*5) {
1403         unsigned char *buf = data->buf;
1404         Py_ssize_t len = data->len;
1405 
1406         Py_BEGIN_ALLOW_THREADS
1407         /* Avoid truncation of length for very large buffers. adler32() takes
1408            length as an unsigned int, which may be narrower than Py_ssize_t. */
1409         while ((size_t)len > UINT_MAX) {
1410             value = adler32(value, buf, UINT_MAX);
1411             buf += (size_t) UINT_MAX;
1412             len -= (size_t) UINT_MAX;
1413         }
1414         value = adler32(value, buf, (unsigned int)len);
1415         Py_END_ALLOW_THREADS
1416     } else {
1417         value = adler32(value, data->buf, (unsigned int)data->len);
1418     }
1419     return PyLong_FromUnsignedLong(value & 0xffffffffU);
1420 }
1421 
1422 /*[clinic input]
1423 zlib.crc32 -> unsigned_int
1424 
1425     data: Py_buffer
1426     value: unsigned_int(bitwise=True) = 0
1427         Starting value of the checksum.
1428     /
1429 
1430 Compute a CRC-32 checksum of data.
1431 
1432 The returned checksum is an integer.
1433 [clinic start generated code]*/
1434 
1435 static unsigned int
zlib_crc32_impl(PyObject * module,Py_buffer * data,unsigned int value)1436 zlib_crc32_impl(PyObject *module, Py_buffer *data, unsigned int value)
1437 /*[clinic end generated code: output=b217562e4fe6d6a6 input=1229cb2fb5ea948a]*/
1438 {
1439     /* Releasing the GIL for very small buffers is inefficient
1440        and may lower performance */
1441     if (data->len > 1024*5) {
1442         unsigned char *buf = data->buf;
1443         Py_ssize_t len = data->len;
1444 
1445         Py_BEGIN_ALLOW_THREADS
1446         /* Avoid truncation of length for very large buffers. crc32() takes
1447            length as an unsigned int, which may be narrower than Py_ssize_t. */
1448         while ((size_t)len > UINT_MAX) {
1449             value = crc32(value, buf, UINT_MAX);
1450             buf += (size_t) UINT_MAX;
1451             len -= (size_t) UINT_MAX;
1452         }
1453         value = crc32(value, buf, (unsigned int)len);
1454         Py_END_ALLOW_THREADS
1455     } else {
1456         value = crc32(value, data->buf, (unsigned int)data->len);
1457     }
1458     return value;
1459 }
1460 
1461 
1462 static PyMethodDef zlib_methods[] =
1463 {
1464     ZLIB_ADLER32_METHODDEF
1465     ZLIB_COMPRESS_METHODDEF
1466     ZLIB_COMPRESSOBJ_METHODDEF
1467     ZLIB_CRC32_METHODDEF
1468     ZLIB_DECOMPRESS_METHODDEF
1469     ZLIB_DECOMPRESSOBJ_METHODDEF
1470     {NULL, NULL}
1471 };
1472 
1473 static PyType_Slot Comptype_slots[] = {
1474     {Py_tp_dealloc, Comp_dealloc},
1475     {Py_tp_methods, comp_methods},
1476     {0, 0},
1477 };
1478 
1479 static PyType_Spec Comptype_spec = {
1480     .name = "zlib.Compress",
1481     .basicsize = sizeof(compobject),
1482     .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
1483     .slots= Comptype_slots,
1484 };
1485 
1486 static PyType_Slot Decomptype_slots[] = {
1487     {Py_tp_dealloc, Decomp_dealloc},
1488     {Py_tp_methods, Decomp_methods},
1489     {Py_tp_members, Decomp_members},
1490     {0, 0},
1491 };
1492 
1493 static PyType_Spec Decomptype_spec = {
1494     .name = "zlib.Decompress",
1495     .basicsize = sizeof(compobject),
1496     .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
1497     .slots = Decomptype_slots,
1498 };
1499 
1500 PyDoc_STRVAR(zlib_module_documentation,
1501 "The functions in this module allow compression and decompression using the\n"
1502 "zlib library, which is based on GNU zip.\n"
1503 "\n"
1504 "adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
1505 "compress(data[, level]) -- Compress data, with compression level 0-9 or -1.\n"
1506 "compressobj([level[, ...]]) -- Return a compressor object.\n"
1507 "crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
1508 "decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
1509 "decompressobj([wbits[, zdict]]) -- Return a decompressor object.\n"
1510 "\n"
1511 "'wbits' is window buffer size and container format.\n"
1512 "Compressor objects support compress() and flush() methods; decompressor\n"
1513 "objects support decompress() and flush().");
1514 
1515 static int
zlib_clear(PyObject * mod)1516 zlib_clear(PyObject *mod)
1517 {
1518     zlibstate *state = get_zlib_state(mod);
1519     Py_CLEAR(state->Comptype);
1520     Py_CLEAR(state->Decomptype);
1521     Py_CLEAR(state->ZlibError);
1522     return 0;
1523 }
1524 
1525 static int
zlib_traverse(PyObject * mod,visitproc visit,void * arg)1526 zlib_traverse(PyObject *mod, visitproc visit, void *arg)
1527 {
1528     zlibstate *state = get_zlib_state(mod);
1529     Py_VISIT(state->Comptype);
1530     Py_VISIT(state->Decomptype);
1531     Py_VISIT(state->ZlibError);
1532     return 0;
1533 }
1534 
1535 static void
zlib_free(void * mod)1536 zlib_free(void *mod)
1537 {
1538     zlib_clear((PyObject *)mod);
1539 }
1540 
1541 static int
zlib_exec(PyObject * mod)1542 zlib_exec(PyObject *mod)
1543 {
1544     zlibstate *state = get_zlib_state(mod);
1545 
1546     state->Comptype = (PyTypeObject *)PyType_FromModuleAndSpec(
1547         mod, &Comptype_spec, NULL);
1548     if (state->Comptype == NULL) {
1549         return -1;
1550     }
1551 
1552     state->Decomptype = (PyTypeObject *)PyType_FromModuleAndSpec(
1553         mod, &Decomptype_spec, NULL);
1554     if (state->Decomptype == NULL) {
1555         return -1;
1556     }
1557 
1558     state->ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1559     if (state->ZlibError == NULL) {
1560         return -1;
1561     }
1562 
1563     Py_INCREF(state->ZlibError);
1564     if (PyModule_AddObject(mod, "error", state->ZlibError) < 0) {
1565         Py_DECREF(state->ZlibError);
1566         return -1;
1567     }
1568 
1569 #define ZLIB_ADD_INT_MACRO(c)                           \
1570     do {                                                \
1571         if ((PyModule_AddIntConstant(mod, #c, c)) < 0) {  \
1572             return -1;                                  \
1573         }                                               \
1574     } while(0)
1575 
1576     ZLIB_ADD_INT_MACRO(MAX_WBITS);
1577     ZLIB_ADD_INT_MACRO(DEFLATED);
1578     ZLIB_ADD_INT_MACRO(DEF_MEM_LEVEL);
1579     ZLIB_ADD_INT_MACRO(DEF_BUF_SIZE);
1580     // compression levels
1581     ZLIB_ADD_INT_MACRO(Z_NO_COMPRESSION);
1582     ZLIB_ADD_INT_MACRO(Z_BEST_SPEED);
1583     ZLIB_ADD_INT_MACRO(Z_BEST_COMPRESSION);
1584     ZLIB_ADD_INT_MACRO(Z_DEFAULT_COMPRESSION);
1585     // compression strategies
1586     ZLIB_ADD_INT_MACRO(Z_FILTERED);
1587     ZLIB_ADD_INT_MACRO(Z_HUFFMAN_ONLY);
1588 #ifdef Z_RLE // 1.2.0.1
1589     ZLIB_ADD_INT_MACRO(Z_RLE);
1590 #endif
1591 #ifdef Z_FIXED // 1.2.2.2
1592     ZLIB_ADD_INT_MACRO(Z_FIXED);
1593 #endif
1594     ZLIB_ADD_INT_MACRO(Z_DEFAULT_STRATEGY);
1595     // allowed flush values
1596     ZLIB_ADD_INT_MACRO(Z_NO_FLUSH);
1597     ZLIB_ADD_INT_MACRO(Z_PARTIAL_FLUSH);
1598     ZLIB_ADD_INT_MACRO(Z_SYNC_FLUSH);
1599     ZLIB_ADD_INT_MACRO(Z_FULL_FLUSH);
1600     ZLIB_ADD_INT_MACRO(Z_FINISH);
1601 #ifdef Z_BLOCK // 1.2.0.5 for inflate, 1.2.3.4 for deflate
1602     ZLIB_ADD_INT_MACRO(Z_BLOCK);
1603 #endif
1604 #ifdef Z_TREES // 1.2.3.4, only for inflate
1605     ZLIB_ADD_INT_MACRO(Z_TREES);
1606 #endif
1607     PyObject *ver = PyUnicode_FromString(ZLIB_VERSION);
1608     if (ver == NULL) {
1609         return -1;
1610     }
1611 
1612     if (PyModule_AddObject(mod, "ZLIB_VERSION", ver) < 0) {
1613         Py_DECREF(ver);
1614         return -1;
1615     }
1616 
1617     ver = PyUnicode_FromString(zlibVersion());
1618     if (ver == NULL) {
1619         return -1;
1620     }
1621 
1622     if (PyModule_AddObject(mod, "ZLIB_RUNTIME_VERSION", ver) < 0) {
1623         Py_DECREF(ver);
1624         return -1;
1625     }
1626 
1627     if (PyModule_AddStringConstant(mod, "__version__", "1.0") < 0) {
1628         return -1;
1629     }
1630     return 0;
1631 }
1632 
1633 static PyModuleDef_Slot zlib_slots[] = {
1634     {Py_mod_exec, zlib_exec},
1635     {0, NULL}
1636 };
1637 
1638 static struct PyModuleDef zlibmodule = {
1639     PyModuleDef_HEAD_INIT,
1640     .m_name = "zlib",
1641     .m_doc = zlib_module_documentation,
1642     .m_size = sizeof(zlibstate),
1643     .m_methods = zlib_methods,
1644     .m_slots = zlib_slots,
1645     .m_traverse = zlib_traverse,
1646     .m_clear = zlib_clear,
1647     .m_free = zlib_free,
1648 };
1649 
1650 PyMODINIT_FUNC
PyInit_zlib(void)1651 PyInit_zlib(void)
1652 {
1653     return PyModuleDef_Init(&zlibmodule);
1654 }
1655