Branch data Line data Source code
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
22 : 68174 : 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 : 68174 : allocated = _BlocksOutputBuffer_InitAndGrow(
28 : : buffer, max_length, (void**) next_out);
29 : 68174 : *avail_out = (uint32_t) allocated;
30 : 68174 : return allocated;
31 : : }
32 : :
33 : : /* On success, return value >= 0
34 : : On failure, return -1 */
35 : : static inline Py_ssize_t
36 : 775 : OutputBuffer_Grow(_BlocksOutputBuffer *buffer,
37 : : Bytef **next_out, uint32_t *avail_out)
38 : : {
39 : : Py_ssize_t allocated;
40 : :
41 : 775 : allocated = _BlocksOutputBuffer_Grow(
42 : 775 : buffer, (void**) next_out, (Py_ssize_t) *avail_out);
43 : 775 : *avail_out = (uint32_t) allocated;
44 : 775 : return allocated;
45 : : }
46 : :
47 : : static inline Py_ssize_t
48 : 24548 : OutputBuffer_GetDataSize(_BlocksOutputBuffer *buffer, uint32_t avail_out)
49 : : {
50 : 24548 : return _BlocksOutputBuffer_GetDataSize(buffer, (Py_ssize_t) avail_out);
51 : : }
52 : :
53 : : static inline PyObject *
54 : 68169 : OutputBuffer_Finish(_BlocksOutputBuffer *buffer, uint32_t avail_out)
55 : : {
56 : 68169 : return _BlocksOutputBuffer_Finish(buffer, (Py_ssize_t) avail_out);
57 : : }
58 : :
59 : : static inline void
60 : 5 : OutputBuffer_OnError(_BlocksOutputBuffer *buffer)
61 : : {
62 : 5 : _BlocksOutputBuffer_OnError(buffer);
63 : 5 : }
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
90 : 6611 : OutputBuffer_WindowInitWithSize(_BlocksOutputBuffer *buffer, _Uint32Window *window,
91 : : Py_ssize_t init_size,
92 : : Bytef **next_out, uint32_t *avail_out)
93 : : {
94 : 6611 : Py_ssize_t allocated = _BlocksOutputBuffer_InitWithSize(
95 : : buffer, init_size, (void**) next_out);
96 : :
97 [ + - ]: 6611 : if (allocated >= 0) {
98 : : // the UINT32_MAX sliding window
99 : 6611 : Py_ssize_t window_size = Py_MIN((size_t)allocated, UINT32_MAX);
100 : 6611 : *avail_out = (uint32_t) window_size;
101 : :
102 : 6611 : window->left_bytes = allocated - window_size;
103 : 6611 : window->next_posi = *next_out + window_size;
104 : : }
105 : 6611 : 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
113 : 730 : 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 [ - + ]: 730 : if (*avail_out != 0) {
121 : 0 : PyErr_SetString(PyExc_SystemError,
122 : : "*avail_out != 0 in OutputBuffer_WindowGrow().");
123 : 0 : return -1;
124 : : }
125 : :
126 : : // slide the UINT32_MAX sliding window
127 [ - + ]: 730 : if (window->left_bytes > 0) {
128 : 0 : Py_ssize_t window_size = Py_MIN((size_t)window->left_bytes, UINT32_MAX);
129 : :
130 : 0 : *next_out = window->next_posi;
131 : 0 : *avail_out = (uint32_t) window_size;
132 : :
133 : 0 : window->left_bytes -= window_size;
134 : 0 : window->next_posi += window_size;
135 : :
136 : 0 : return window_size;
137 : : }
138 : : assert(window->left_bytes == 0);
139 : :
140 : : // only the first block may > UINT32_MAX
141 : 730 : allocated = _BlocksOutputBuffer_Grow(
142 : 730 : buffer, (void**) next_out, (Py_ssize_t) *avail_out);
143 : 730 : *avail_out = (uint32_t) allocated;
144 : 730 : 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 *
152 : 6607 : OutputBuffer_WindowFinish(_BlocksOutputBuffer *buffer, _Uint32Window *window,
153 : : uint32_t avail_out)
154 : : {
155 : 6607 : Py_ssize_t real_avail_out = (Py_ssize_t) avail_out + window->left_bytes;
156 : 6607 : return _BlocksOutputBuffer_Finish(buffer, real_avail_out);
157 : : }
158 : :
159 : : static inline void
160 : 4 : OutputBuffer_WindowOnError(_BlocksOutputBuffer *buffer, _Uint32Window *window)
161 : : {
162 : 4 : _BlocksOutputBuffer_OnError(buffer);
163 : 4 : }
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*
198 : 83398 : get_zlib_state(PyObject *module)
199 : : {
200 : 83398 : void *state = PyModule_GetState(module);
201 : : assert(state != NULL);
202 : 83398 : 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
218 : 8 : zlib_error(zlibstate *state, z_stream zst, int err, const char *msg)
219 : : {
220 : 8 : 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 [ - + ]: 8 : if (err == Z_VERSION_ERROR)
224 : 0 : zmsg = "library version mismatch";
225 [ + - ]: 8 : if (zmsg == Z_NULL)
226 : 8 : zmsg = zst.msg;
227 [ + + ]: 8 : if (zmsg == Z_NULL) {
228 [ + + - + ]: 5 : switch (err) {
229 : 2 : case Z_BUF_ERROR:
230 : 2 : zmsg = "incomplete or truncated stream";
231 : 2 : break;
232 : 2 : case Z_STREAM_ERROR:
233 : 2 : zmsg = "inconsistent stream state";
234 : 2 : break;
235 : 0 : case Z_DATA_ERROR:
236 : 0 : zmsg = "invalid input data";
237 : 0 : break;
238 : : }
239 : : }
240 [ + + ]: 8 : if (zmsg == Z_NULL)
241 : 1 : PyErr_Format(state->ZlibError, "Error %d %s", err, msg);
242 : : else
243 : 7 : PyErr_Format(state->ZlibError, "Error %d %s: %.200s", err, msg, zmsg);
244 : 8 : }
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 *
254 : 5418 : newcompobject(PyTypeObject *type)
255 : : {
256 : : compobject *self;
257 : 5418 : self = PyObject_New(compobject, type);
258 [ - + ]: 5418 : if (self == NULL)
259 : 0 : return NULL;
260 : 5418 : self->eof = 0;
261 : 5418 : self->is_initialised = 0;
262 : 5418 : self->zdict = NULL;
263 : 5418 : self->unused_data = PyBytes_FromStringAndSize("", 0);
264 [ - + ]: 5418 : if (self->unused_data == NULL) {
265 : 0 : Py_DECREF(self);
266 : 0 : return NULL;
267 : : }
268 : 5418 : self->unconsumed_tail = PyBytes_FromStringAndSize("", 0);
269 [ - + ]: 5418 : if (self->unconsumed_tail == NULL) {
270 : 0 : Py_DECREF(self);
271 : 0 : return NULL;
272 : : }
273 : 5418 : self->lock = PyThread_allocate_lock();
274 [ - + ]: 5418 : if (self->lock == NULL) {
275 : 0 : Py_DECREF(self);
276 : 0 : PyErr_SetString(PyExc_MemoryError, "Unable to allocate lock");
277 : 0 : return NULL;
278 : : }
279 : 5418 : return self;
280 : : }
281 : :
282 : : static void*
283 : 16791 : PyZlib_Malloc(voidpf ctx, uInt items, uInt size)
284 : : {
285 [ + - - + ]: 16791 : if (size != 0 && items > (size_t)PY_SSIZE_T_MAX / size)
286 : 0 : return NULL;
287 : : /* PyMem_Malloc() cannot be used: the GIL is not held when
288 : : inflate() and deflate() are called */
289 : 16791 : return PyMem_RawMalloc((size_t)items * (size_t)size);
290 : : }
291 : :
292 : : static void
293 : 16791 : PyZlib_Free(voidpf ctx, void *ptr)
294 : : {
295 : 16791 : PyMem_RawFree(ptr);
296 : 16791 : }
297 : :
298 : : static void
299 : 73883 : arrange_input_buffer(z_stream *zst, Py_ssize_t *remains)
300 : : {
301 [ + - ]: 73883 : zst->avail_in = (uInt)Py_MIN((size_t)*remains, UINT_MAX);
302 : 73883 : *remains -= zst->avail_in;
303 : 73883 : }
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 *
320 : 67 : 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 : 67 : _BlocksOutputBuffer buffer = {.list = NULL};
327 : :
328 : 67 : zlibstate *state = get_zlib_state(module);
329 : :
330 : 67 : Byte *ibuf = data->buf;
331 : 67 : Py_ssize_t ibuflen = data->len;
332 : :
333 [ - + ]: 67 : if (OutputBuffer_InitAndGrow(&buffer, -1, &zst.next_out, &zst.avail_out) < 0) {
334 : 0 : goto error;
335 : : }
336 : :
337 : 67 : zst.opaque = NULL;
338 : 67 : zst.zalloc = PyZlib_Malloc;
339 : 67 : zst.zfree = PyZlib_Free;
340 : 67 : zst.next_in = ibuf;
341 : 67 : int err = deflateInit2(&zst, level, DEFLATED, wbits, DEF_MEM_LEVEL,
342 : : Z_DEFAULT_STRATEGY);
343 : :
344 [ + - + - ]: 67 : switch (err) {
345 : 66 : case Z_OK:
346 : 66 : break;
347 : 0 : case Z_MEM_ERROR:
348 : 0 : PyErr_SetString(PyExc_MemoryError,
349 : : "Out of memory while compressing data");
350 : 0 : goto error;
351 : 1 : case Z_STREAM_ERROR:
352 : 1 : PyErr_SetString(state->ZlibError, "Bad compression level");
353 : 1 : goto error;
354 : 0 : default:
355 : 0 : deflateEnd(&zst);
356 : 0 : zlib_error(state, zst, err, "while compressing data");
357 : 0 : goto error;
358 : : }
359 : :
360 : : do {
361 : 66 : arrange_input_buffer(&zst, &ibuflen);
362 [ + - ]: 66 : flush = ibuflen == 0 ? Z_FINISH : Z_NO_FLUSH;
363 : :
364 : : do {
365 [ + + ]: 71 : if (zst.avail_out == 0) {
366 [ - + ]: 5 : if (OutputBuffer_Grow(&buffer, &zst.next_out, &zst.avail_out) < 0) {
367 : 0 : deflateEnd(&zst);
368 : 0 : goto error;
369 : : }
370 : : }
371 : :
372 : 71 : Py_BEGIN_ALLOW_THREADS
373 : 71 : err = deflate(&zst, flush);
374 : 71 : Py_END_ALLOW_THREADS
375 : :
376 [ - + ]: 71 : if (err == Z_STREAM_ERROR) {
377 : 0 : deflateEnd(&zst);
378 : 0 : zlib_error(state, zst, err, "while compressing data");
379 : 0 : goto error;
380 : : }
381 : :
382 [ + + ]: 71 : } while (zst.avail_out == 0);
383 : : assert(zst.avail_in == 0);
384 : :
385 [ - + ]: 66 : } while (flush != Z_FINISH);
386 : : assert(err == Z_STREAM_END);
387 : :
388 : 66 : err = deflateEnd(&zst);
389 [ + - ]: 66 : if (err == Z_OK) {
390 : 66 : RetVal = OutputBuffer_Finish(&buffer, zst.avail_out);
391 [ - + ]: 66 : if (RetVal == NULL) {
392 : 0 : goto error;
393 : : }
394 : 66 : return RetVal;
395 : : }
396 : : else
397 : 0 : zlib_error(state, zst, err, "while finishing compression");
398 : 1 : error:
399 : 1 : OutputBuffer_OnError(&buffer);
400 : 1 : 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 *
418 : 3305 : 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 : 3305 : _BlocksOutputBuffer buffer = {.list = NULL};
428 : : _Uint32Window window; // output buffer's UINT32_MAX sliding window
429 : :
430 : 3305 : zlibstate *state = get_zlib_state(module);
431 : :
432 [ - + ]: 3305 : if (bufsize < 0) {
433 : 0 : PyErr_SetString(PyExc_ValueError, "bufsize must be non-negative");
434 : 0 : return NULL;
435 [ - + ]: 3305 : } else if (bufsize == 0) {
436 : 0 : bufsize = 1;
437 : : }
438 : :
439 [ - + ]: 3305 : if (OutputBuffer_WindowInitWithSize(&buffer, &window, bufsize,
440 : : &zst.next_out, &zst.avail_out) < 0) {
441 : 0 : goto error;
442 : : }
443 : :
444 : 3305 : ibuf = data->buf;
445 : 3305 : ibuflen = data->len;
446 : :
447 : 3305 : zst.opaque = NULL;
448 : 3305 : zst.zalloc = PyZlib_Malloc;
449 : 3305 : zst.zfree = PyZlib_Free;
450 : 3305 : zst.avail_in = 0;
451 : 3305 : zst.next_in = ibuf;
452 : 3305 : err = inflateInit2(&zst, wbits);
453 : :
454 [ + - - ]: 3305 : switch (err) {
455 : 3305 : case Z_OK:
456 : 3305 : break;
457 : 0 : case Z_MEM_ERROR:
458 : 0 : PyErr_SetString(PyExc_MemoryError,
459 : : "Out of memory while decompressing data");
460 : 0 : goto error;
461 : 0 : default:
462 : 0 : inflateEnd(&zst);
463 : 0 : zlib_error(state, zst, err, "while preparing to decompress data");
464 : 0 : goto error;
465 : : }
466 : :
467 : : do {
468 : 3305 : arrange_input_buffer(&zst, &ibuflen);
469 [ + - ]: 3305 : flush = ibuflen == 0 ? Z_FINISH : Z_NO_FLUSH;
470 : :
471 : : do {
472 [ + + ]: 4033 : if (zst.avail_out == 0) {
473 [ - + ]: 728 : if (OutputBuffer_WindowGrow(&buffer, &window,
474 : : &zst.next_out, &zst.avail_out) < 0) {
475 : 0 : inflateEnd(&zst);
476 : 0 : goto error;
477 : : }
478 : : }
479 : :
480 : 4033 : Py_BEGIN_ALLOW_THREADS
481 : 4033 : err = inflate(&zst, flush);
482 : 4033 : Py_END_ALLOW_THREADS
483 : :
484 [ + - + ]: 4033 : switch (err) {
485 : 4031 : case Z_OK: /* fall through */
486 : : case Z_BUF_ERROR: /* fall through */
487 : : case Z_STREAM_END:
488 : 4031 : break;
489 : 0 : case Z_MEM_ERROR:
490 : 0 : inflateEnd(&zst);
491 : 0 : PyErr_SetString(PyExc_MemoryError,
492 : : "Out of memory while decompressing data");
493 : 0 : goto error;
494 : 2 : default:
495 : 2 : inflateEnd(&zst);
496 : 2 : zlib_error(state, zst, err, "while decompressing data");
497 : 2 : goto error;
498 : : }
499 : :
500 [ + + ]: 4031 : } while (zst.avail_out == 0);
501 : :
502 [ + + - + ]: 3303 : } while (err != Z_STREAM_END && ibuflen != 0);
503 : :
504 : :
505 [ + + ]: 3303 : if (err != Z_STREAM_END) {
506 : 2 : inflateEnd(&zst);
507 : 2 : zlib_error(state, zst, err, "while decompressing data");
508 : 2 : goto error;
509 : : }
510 : :
511 : 3301 : err = inflateEnd(&zst);
512 [ - + ]: 3301 : if (err != Z_OK) {
513 : 0 : zlib_error(state, zst, err, "while finishing decompression");
514 : 0 : goto error;
515 : : }
516 : :
517 : 3301 : RetVal = OutputBuffer_WindowFinish(&buffer, &window, zst.avail_out);
518 [ + - ]: 3301 : if (RetVal != NULL) {
519 : 3301 : return RetVal;
520 : : }
521 : :
522 : 0 : error:
523 : 4 : OutputBuffer_WindowOnError(&buffer, &window);
524 : 4 : 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 *
556 : 847 : 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 : 847 : zlibstate *state = get_zlib_state(module);
561 [ + + - + ]: 847 : if (zdict->buf != NULL && (size_t)zdict->len > UINT_MAX) {
562 : 0 : PyErr_SetString(PyExc_OverflowError,
563 : : "zdict length does not fit in an unsigned int");
564 : 0 : return NULL;
565 : : }
566 : :
567 : 847 : compobject *self = newcompobject(state->Comptype);
568 [ - + ]: 847 : if (self == NULL)
569 : 0 : goto error;
570 : 847 : self->zst.opaque = NULL;
571 : 847 : self->zst.zalloc = PyZlib_Malloc;
572 : 847 : self->zst.zfree = PyZlib_Free;
573 : 847 : self->zst.next_in = NULL;
574 : 847 : self->zst.avail_in = 0;
575 : 847 : int err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
576 [ + - + - ]: 847 : switch (err) {
577 : 845 : case Z_OK:
578 : 845 : self->is_initialised = 1;
579 [ + + ]: 845 : if (zdict->buf == NULL) {
580 : 841 : goto success;
581 : : } else {
582 : 4 : err = deflateSetDictionary(&self->zst,
583 : 4 : zdict->buf, (unsigned int)zdict->len);
584 [ + - - ]: 4 : switch (err) {
585 : 4 : case Z_OK:
586 : 4 : goto success;
587 : 0 : case Z_STREAM_ERROR:
588 : 0 : PyErr_SetString(PyExc_ValueError, "Invalid dictionary");
589 : 0 : goto error;
590 : 0 : default:
591 : 0 : PyErr_SetString(PyExc_ValueError, "deflateSetDictionary()");
592 : 0 : goto error;
593 : : }
594 : : }
595 : 0 : case Z_MEM_ERROR:
596 : 0 : PyErr_SetString(PyExc_MemoryError,
597 : : "Can't allocate memory for compression object");
598 : 0 : goto error;
599 : 2 : case Z_STREAM_ERROR:
600 : 2 : PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
601 : 2 : goto error;
602 : 0 : default:
603 : 0 : zlib_error(state, self->zst, err, "while creating compression object");
604 : 0 : goto error;
605 : : }
606 : :
607 : 2 : error:
608 [ - + ]: 2 : Py_CLEAR(self);
609 : 0 : success:
610 : 847 : return (PyObject *)self;
611 : : }
612 : :
613 : : static int
614 : 4 : set_inflate_zdict(zlibstate *state, compobject *self)
615 : : {
616 : : Py_buffer zdict_buf;
617 [ - + ]: 4 : if (PyObject_GetBuffer(self->zdict, &zdict_buf, PyBUF_SIMPLE) == -1) {
618 : 0 : return -1;
619 : : }
620 [ - + ]: 4 : if ((size_t)zdict_buf.len > UINT_MAX) {
621 : 0 : PyErr_SetString(PyExc_OverflowError,
622 : : "zdict length does not fit in an unsigned int");
623 : 0 : PyBuffer_Release(&zdict_buf);
624 : 0 : return -1;
625 : : }
626 : : int err;
627 : 4 : err = inflateSetDictionary(&self->zst,
628 : 4 : zdict_buf.buf, (unsigned int)zdict_buf.len);
629 : 4 : PyBuffer_Release(&zdict_buf);
630 [ - + ]: 4 : if (err != Z_OK) {
631 : 0 : zlib_error(state, self->zst, err, "while setting zdict");
632 : 0 : return -1;
633 : : }
634 : 4 : 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 *
650 : 4559 : zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict)
651 : : /*[clinic end generated code: output=3069b99994f36906 input=d3832b8511fc977b]*/
652 : : {
653 : 4559 : zlibstate *state = get_zlib_state(module);
654 : :
655 [ + + - + ]: 4559 : if (zdict != NULL && !PyObject_CheckBuffer(zdict)) {
656 : 0 : PyErr_SetString(PyExc_TypeError,
657 : : "zdict argument must support the buffer protocol");
658 : 0 : return NULL;
659 : : }
660 : :
661 : 4559 : compobject *self = newcompobject(state->Decomptype);
662 [ - + ]: 4559 : if (self == NULL)
663 : 0 : return NULL;
664 : 4559 : self->zst.opaque = NULL;
665 : 4559 : self->zst.zalloc = PyZlib_Malloc;
666 : 4559 : self->zst.zfree = PyZlib_Free;
667 : 4559 : self->zst.next_in = NULL;
668 : 4559 : self->zst.avail_in = 0;
669 [ + + ]: 4559 : if (zdict != NULL) {
670 : 4 : Py_INCREF(zdict);
671 : 4 : self->zdict = zdict;
672 : : }
673 : 4559 : int err = inflateInit2(&self->zst, wbits);
674 [ + + - - ]: 4559 : switch (err) {
675 : 4558 : case Z_OK:
676 : 4558 : self->is_initialised = 1;
677 [ + + + + ]: 4558 : if (self->zdict != NULL && wbits < 0) {
678 : : #ifdef AT_LEAST_ZLIB_1_2_2_1
679 [ - + ]: 2 : if (set_inflate_zdict(state, self) < 0) {
680 : 0 : Py_DECREF(self);
681 : 0 : 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 : 4558 : return (PyObject *)self;
692 : 1 : case Z_STREAM_ERROR:
693 : 1 : Py_DECREF(self);
694 : 1 : PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
695 : 1 : return NULL;
696 : 0 : case Z_MEM_ERROR:
697 : 0 : Py_DECREF(self);
698 : 0 : PyErr_SetString(PyExc_MemoryError,
699 : : "Can't allocate memory for decompression object");
700 : 0 : return NULL;
701 : 0 : default:
702 : 0 : zlib_error(state, self->zst, err, "while creating decompression object");
703 : 0 : Py_DECREF(self);
704 : 0 : return NULL;
705 : : }
706 : : }
707 : :
708 : : static void
709 : 5418 : Dealloc(compobject *self)
710 : : {
711 : 5418 : PyObject *type = (PyObject *)Py_TYPE(self);
712 : 5418 : PyThread_free_lock(self->lock);
713 : 5418 : Py_XDECREF(self->unused_data);
714 : 5418 : Py_XDECREF(self->unconsumed_tail);
715 : 5418 : Py_XDECREF(self->zdict);
716 : 5418 : PyObject_Free(self);
717 : 5418 : Py_DECREF(type);
718 : 5418 : }
719 : :
720 : : static void
721 : 853 : Comp_dealloc(compobject *self)
722 : : {
723 [ + + ]: 853 : if (self->is_initialised)
724 : 10 : deflateEnd(&self->zst);
725 : 853 : Dealloc(self);
726 : 853 : }
727 : :
728 : : static void
729 : 4565 : Decomp_dealloc(compobject *self)
730 : : {
731 [ + + ]: 4565 : if (self->is_initialised)
732 : 1258 : inflateEnd(&self->zst);
733 : 4565 : Dealloc(self);
734 : 4565 : }
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 *
752 : 38943 : 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 : 38943 : _BlocksOutputBuffer buffer = {.list = NULL};
759 : 38943 : zlibstate *state = PyType_GetModuleState(cls);
760 : :
761 [ - + ]: 38943 : ENTER_ZLIB(self);
762 : :
763 : 38943 : self->zst.next_in = data->buf;
764 : 38943 : Py_ssize_t ibuflen = data->len;
765 : :
766 [ - + ]: 38943 : if (OutputBuffer_InitAndGrow(&buffer, -1, &self->zst.next_out, &self->zst.avail_out) < 0) {
767 : 0 : goto error;
768 : : }
769 : :
770 : : do {
771 : 38943 : arrange_input_buffer(&self->zst, &ibuflen);
772 : :
773 : : do {
774 [ + + ]: 38950 : if (self->zst.avail_out == 0) {
775 [ - + ]: 7 : if (OutputBuffer_Grow(&buffer, &self->zst.next_out, &self->zst.avail_out) < 0) {
776 : 0 : goto error;
777 : : }
778 : : }
779 : :
780 : 38950 : Py_BEGIN_ALLOW_THREADS
781 : 38950 : err = deflate(&self->zst, Z_NO_FLUSH);
782 : 38950 : Py_END_ALLOW_THREADS
783 : :
784 [ - + ]: 38950 : if (err == Z_STREAM_ERROR) {
785 : 0 : zlib_error(state, self->zst, err, "while compressing data");
786 : 0 : goto error;
787 : : }
788 : :
789 [ + + ]: 38950 : } while (self->zst.avail_out == 0);
790 : : assert(self->zst.avail_in == 0);
791 : :
792 [ - + ]: 38943 : } while (ibuflen != 0);
793 : :
794 : 38943 : RetVal = OutputBuffer_Finish(&buffer, self->zst.avail_out);
795 [ + - ]: 38943 : if (RetVal != NULL) {
796 : 38943 : goto success;
797 : : }
798 : :
799 : 0 : error:
800 : 0 : OutputBuffer_OnError(&buffer);
801 : 0 : RetVal = NULL;
802 : 38943 : success:
803 : 38943 : LEAVE_ZLIB(self);
804 : 38943 : 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
810 : 31569 : save_unconsumed_input(compobject *self, Py_buffer *data, int err)
811 : : {
812 [ + + ]: 31569 : 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 [ + + ]: 6988 : if (self->zst.avail_in > 0) {
816 : 370 : Py_ssize_t old_size = PyBytes_GET_SIZE(self->unused_data);
817 : : Py_ssize_t new_size, left_size;
818 : : PyObject *new_data;
819 : 370 : left_size = (Byte *)data->buf + data->len - self->zst.next_in;
820 [ - + ]: 370 : if (left_size > (PY_SSIZE_T_MAX - old_size)) {
821 : : PyErr_NoMemory();
822 : 0 : return -1;
823 : : }
824 : 370 : new_size = old_size + left_size;
825 : 370 : new_data = PyBytes_FromStringAndSize(NULL, new_size);
826 [ - + ]: 370 : if (new_data == NULL)
827 : 0 : return -1;
828 : 370 : memcpy(PyBytes_AS_STRING(new_data),
829 : 370 : PyBytes_AS_STRING(self->unused_data), old_size);
830 : 740 : memcpy(PyBytes_AS_STRING(new_data) + old_size,
831 : 370 : self->zst.next_in, left_size);
832 : 370 : Py_SETREF(self->unused_data, new_data);
833 : 370 : self->zst.avail_in = 0;
834 : : }
835 : : }
836 : :
837 [ + + + + ]: 31569 : 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 : 24316 : Py_ssize_t left_size = (Byte *)data->buf + data->len - self->zst.next_in;
842 : 24316 : PyObject *new_data = PyBytes_FromStringAndSize(
843 : 24316 : (char *)self->zst.next_in, left_size);
844 [ - + ]: 24316 : if (new_data == NULL)
845 : 0 : return -1;
846 : 24316 : Py_SETREF(self->unconsumed_tail, new_data);
847 : : }
848 : :
849 : 31569 : 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 *
872 : 28264 : 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 : 28264 : int err = Z_OK;
877 : : Py_ssize_t ibuflen;
878 : : PyObject *RetVal;
879 : 28264 : _BlocksOutputBuffer buffer = {.list = NULL};
880 : :
881 : 28264 : PyObject *module = PyType_GetModule(cls);
882 [ - + ]: 28264 : if (module == NULL)
883 : 0 : return NULL;
884 : :
885 : 28264 : zlibstate *state = get_zlib_state(module);
886 [ + + ]: 28264 : if (max_length < 0) {
887 : 1 : PyErr_SetString(PyExc_ValueError, "max_length must be non-negative");
888 : 1 : return NULL;
889 [ + + ]: 28263 : } else if (max_length == 0) {
890 : 224 : max_length = -1;
891 : : }
892 : :
893 [ - + ]: 28263 : ENTER_ZLIB(self);
894 : :
895 : 28263 : self->zst.next_in = data->buf;
896 : 28263 : ibuflen = data->len;
897 : :
898 [ - + ]: 28263 : if (OutputBuffer_InitAndGrow(&buffer, max_length, &self->zst.next_out, &self->zst.avail_out) < 0) {
899 : 0 : goto abort;
900 : : }
901 : :
902 : : do {
903 : 28263 : arrange_input_buffer(&self->zst, &ibuflen);
904 : :
905 : : do {
906 [ + + ]: 52813 : if (self->zst.avail_out == 0) {
907 [ + + ]: 24548 : if (OutputBuffer_GetDataSize(&buffer, self->zst.avail_out) == max_length) {
908 : 23785 : goto save;
909 : : }
910 [ - + ]: 763 : if (OutputBuffer_Grow(&buffer, &self->zst.next_out, &self->zst.avail_out) < 0) {
911 : 0 : goto abort;
912 : : }
913 : : }
914 : :
915 : 29028 : Py_BEGIN_ALLOW_THREADS
916 : 29028 : err = inflate(&self->zst, Z_SYNC_FLUSH);
917 : 29028 : Py_END_ALLOW_THREADS
918 : :
919 [ + + ]: 29028 : switch (err) {
920 : 29024 : case Z_OK: /* fall through */
921 : : case Z_BUF_ERROR: /* fall through */
922 : : case Z_STREAM_END:
923 : 29024 : break;
924 : 4 : default:
925 [ + + + + ]: 4 : if (err == Z_NEED_DICT && self->zdict != NULL) {
926 [ - + ]: 2 : if (set_inflate_zdict(state, self) < 0) {
927 : 0 : goto abort;
928 : : }
929 : : else
930 : 2 : break;
931 : : }
932 : 2 : goto save;
933 : : }
934 : :
935 [ + + + + ]: 29026 : } while (self->zst.avail_out == 0 || err == Z_NEED_DICT);
936 : :
937 [ + + + - ]: 4476 : } while (err != Z_STREAM_END && ibuflen != 0);
938 : :
939 : 4476 : save:
940 [ - + ]: 28263 : if (save_unconsumed_input(self, data, err) < 0)
941 : 0 : goto abort;
942 : :
943 [ + + ]: 28263 : 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 : 3685 : self->eof = 1;
947 [ + + + + ]: 24578 : } 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 : 2 : zlib_error(state, self->zst, err, "while decompressing data");
953 : 2 : goto abort;
954 : : }
955 : :
956 : 28261 : RetVal = OutputBuffer_Finish(&buffer, self->zst.avail_out);
957 [ + - ]: 28261 : if (RetVal != NULL) {
958 : 28261 : goto success;
959 : : }
960 : :
961 : 0 : abort:
962 : 2 : OutputBuffer_OnError(&buffer);
963 : 2 : RetVal = NULL;
964 : 28263 : success:
965 : 28263 : LEAVE_ZLIB(self);
966 : 28263 : 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 *
984 : 911 : 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 : 911 : _BlocksOutputBuffer buffer = {.list = NULL};
990 : :
991 : 911 : 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 [ + + ]: 911 : if (mode == Z_NO_FLUSH) {
995 : 10 : return PyBytes_FromStringAndSize(NULL, 0);
996 : : }
997 : :
998 [ - + ]: 901 : ENTER_ZLIB(self);
999 : :
1000 : 901 : self->zst.avail_in = 0;
1001 : :
1002 [ - + ]: 901 : if (OutputBuffer_InitAndGrow(&buffer, -1, &self->zst.next_out, &self->zst.avail_out) < 0) {
1003 : 0 : goto error;
1004 : : }
1005 : :
1006 : : do {
1007 [ - + ]: 901 : if (self->zst.avail_out == 0) {
1008 [ # # ]: 0 : if (OutputBuffer_Grow(&buffer, &self->zst.next_out, &self->zst.avail_out) < 0) {
1009 : 0 : goto error;
1010 : : }
1011 : : }
1012 : :
1013 : 901 : Py_BEGIN_ALLOW_THREADS
1014 : 901 : err = deflate(&self->zst, mode);
1015 : 901 : Py_END_ALLOW_THREADS
1016 : :
1017 [ + + ]: 901 : if (err == Z_STREAM_ERROR) {
1018 : 2 : zlib_error(state, self->zst, err, "while flushing");
1019 : 2 : goto error;
1020 : : }
1021 [ - + ]: 899 : } 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 [ + + + - ]: 899 : if (err == Z_STREAM_END && mode == Z_FINISH) {
1028 : 838 : err = deflateEnd(&self->zst);
1029 [ - + ]: 838 : if (err != Z_OK) {
1030 : 0 : zlib_error(state, self->zst, err, "while finishing compression");
1031 : 0 : goto error;
1032 : : }
1033 : : else
1034 : 838 : 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 [ - + - - ]: 61 : } else if (err != Z_OK && err != Z_BUF_ERROR) {
1041 : 0 : zlib_error(state, self->zst, err, "while flushing");
1042 : 0 : goto error;
1043 : : }
1044 : :
1045 : 899 : RetVal = OutputBuffer_Finish(&buffer, self->zst.avail_out);
1046 [ + - ]: 899 : if (RetVal != NULL) {
1047 : 899 : goto success;
1048 : : }
1049 : :
1050 : 0 : error:
1051 : 2 : OutputBuffer_OnError(&buffer);
1052 : 2 : RetVal = NULL;
1053 : 901 : success:
1054 : 901 : LEAVE_ZLIB(self);
1055 : 901 : 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 *
1069 : 6 : zlib_Compress_copy_impl(compobject *self, PyTypeObject *cls)
1070 : : /*[clinic end generated code: output=c4d2cfb4b0d7350b input=235497e482d40986]*/
1071 : : {
1072 : 6 : zlibstate *state = PyType_GetModuleState(cls);
1073 : :
1074 : 6 : compobject *retval = newcompobject(state->Comptype);
1075 [ - + ]: 6 : if (!retval) return NULL;
1076 : :
1077 : : /* Copy the zstream state
1078 : : * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
1079 : : */
1080 [ - + ]: 6 : ENTER_ZLIB(self);
1081 : 6 : int err = deflateCopy(&retval->zst, &self->zst);
1082 [ + + - - ]: 6 : switch (err) {
1083 : 3 : case Z_OK:
1084 : 3 : break;
1085 : 3 : case Z_STREAM_ERROR:
1086 : 3 : PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
1087 : 3 : goto error;
1088 : 0 : case Z_MEM_ERROR:
1089 : 0 : PyErr_SetString(PyExc_MemoryError,
1090 : : "Can't allocate memory for compression object");
1091 : 0 : goto error;
1092 : 0 : default:
1093 : 0 : zlib_error(state, self->zst, err, "while copying compression object");
1094 : 0 : goto error;
1095 : : }
1096 : 3 : Py_INCREF(self->unused_data);
1097 : 3 : Py_XSETREF(retval->unused_data, self->unused_data);
1098 : 3 : Py_INCREF(self->unconsumed_tail);
1099 : 3 : Py_XSETREF(retval->unconsumed_tail, self->unconsumed_tail);
1100 : 3 : Py_XINCREF(self->zdict);
1101 : 3 : Py_XSETREF(retval->zdict, self->zdict);
1102 : 3 : retval->eof = self->eof;
1103 : :
1104 : : /* Mark it as being initialized */
1105 : 3 : retval->is_initialised = 1;
1106 : :
1107 : 3 : LEAVE_ZLIB(self);
1108 : 3 : return (PyObject *)retval;
1109 : :
1110 : 3 : error:
1111 : 3 : LEAVE_ZLIB(self);
1112 : 3 : Py_XDECREF(retval);
1113 : 3 : 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 *
1124 : 2 : zlib_Compress___copy___impl(compobject *self, PyTypeObject *cls)
1125 : : /*[clinic end generated code: output=074613db332cb668 input=5c0188367ab0fe64]*/
1126 : : {
1127 : 2 : 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 *
1140 : 2 : zlib_Compress___deepcopy___impl(compobject *self, PyTypeObject *cls,
1141 : : PyObject *memo)
1142 : : /*[clinic end generated code: output=24b3aed785f54033 input=c90347319a514430]*/
1143 : : {
1144 : 2 : 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 *
1156 : 6 : zlib_Decompress_copy_impl(compobject *self, PyTypeObject *cls)
1157 : : /*[clinic end generated code: output=a7ddc016e1d0a781 input=20ef3aa208282ff2]*/
1158 : : {
1159 : 6 : zlibstate *state = PyType_GetModuleState(cls);
1160 : :
1161 : 6 : compobject *retval = newcompobject(state->Decomptype);
1162 [ - + ]: 6 : if (!retval) return NULL;
1163 : :
1164 : : /* Copy the zstream state
1165 : : * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
1166 : : */
1167 [ - + ]: 6 : ENTER_ZLIB(self);
1168 : 6 : int err = inflateCopy(&retval->zst, &self->zst);
1169 [ + + - - ]: 6 : switch (err) {
1170 : 3 : case Z_OK:
1171 : 3 : break;
1172 : 3 : case Z_STREAM_ERROR:
1173 : 3 : PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
1174 : 3 : goto error;
1175 : 0 : case Z_MEM_ERROR:
1176 : 0 : PyErr_SetString(PyExc_MemoryError,
1177 : : "Can't allocate memory for decompression object");
1178 : 0 : goto error;
1179 : 0 : default:
1180 : 0 : zlib_error(state, self->zst, err, "while copying decompression object");
1181 : 0 : goto error;
1182 : : }
1183 : :
1184 : 3 : Py_INCREF(self->unused_data);
1185 : 3 : Py_XSETREF(retval->unused_data, self->unused_data);
1186 : 3 : Py_INCREF(self->unconsumed_tail);
1187 : 3 : Py_XSETREF(retval->unconsumed_tail, self->unconsumed_tail);
1188 : 3 : Py_XINCREF(self->zdict);
1189 : 3 : Py_XSETREF(retval->zdict, self->zdict);
1190 : 3 : retval->eof = self->eof;
1191 : :
1192 : : /* Mark it as being initialized */
1193 : 3 : retval->is_initialised = 1;
1194 : :
1195 : 3 : LEAVE_ZLIB(self);
1196 : 3 : return (PyObject *)retval;
1197 : :
1198 : 3 : error:
1199 : 3 : LEAVE_ZLIB(self);
1200 : 3 : Py_XDECREF(retval);
1201 : 3 : 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 *
1212 : 2 : zlib_Decompress___copy___impl(compobject *self, PyTypeObject *cls)
1213 : : /*[clinic end generated code: output=cf1e6473744f53fa input=cc3143067b622bdf]*/
1214 : : {
1215 : 2 : 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 *
1228 : 2 : zlib_Decompress___deepcopy___impl(compobject *self, PyTypeObject *cls,
1229 : : PyObject *memo)
1230 : : /*[clinic end generated code: output=34f7b719a0c0d51b input=fc13b9c58622544e]*/
1231 : : {
1232 : 2 : 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 *
1249 : 3308 : 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 : 3308 : _BlocksOutputBuffer buffer = {.list = NULL};
1258 : : _Uint32Window window; // output buffer's UINT32_MAX sliding window
1259 : :
1260 : 3308 : PyObject *module = PyType_GetModule(cls);
1261 [ - + ]: 3308 : if (module == NULL) {
1262 : 0 : return NULL;
1263 : : }
1264 : :
1265 : 3308 : zlibstate *state = get_zlib_state(module);
1266 : :
1267 [ + + ]: 3308 : if (length <= 0) {
1268 : 2 : PyErr_SetString(PyExc_ValueError, "length must be greater than zero");
1269 : 2 : return NULL;
1270 : : }
1271 : :
1272 [ - + ]: 3306 : ENTER_ZLIB(self);
1273 : :
1274 [ - + ]: 3306 : if (PyObject_GetBuffer(self->unconsumed_tail, &data, PyBUF_SIMPLE) == -1) {
1275 : 0 : LEAVE_ZLIB(self);
1276 : 0 : return NULL;
1277 : : }
1278 : :
1279 : 3306 : self->zst.next_in = data.buf;
1280 : 3306 : ibuflen = data.len;
1281 : :
1282 [ - + ]: 3306 : if (OutputBuffer_WindowInitWithSize(&buffer, &window, length,
1283 : 3306 : &self->zst.next_out, &self->zst.avail_out) < 0) {
1284 : 0 : goto abort;
1285 : : }
1286 : :
1287 : : do {
1288 : 3306 : arrange_input_buffer(&self->zst, &ibuflen);
1289 [ + - ]: 3306 : flush = ibuflen == 0 ? Z_FINISH : Z_NO_FLUSH;
1290 : :
1291 : : do {
1292 [ + + ]: 3308 : if (self->zst.avail_out == 0) {
1293 [ - + ]: 2 : if (OutputBuffer_WindowGrow(&buffer, &window,
1294 : 2 : &self->zst.next_out, &self->zst.avail_out) < 0) {
1295 : 0 : goto abort;
1296 : : }
1297 : : }
1298 : :
1299 : 3308 : Py_BEGIN_ALLOW_THREADS
1300 : 3308 : err = inflate(&self->zst, flush);
1301 : 3308 : Py_END_ALLOW_THREADS
1302 : :
1303 [ + - ]: 3308 : switch (err) {
1304 : 3308 : case Z_OK: /* fall through */
1305 : : case Z_BUF_ERROR: /* fall through */
1306 : : case Z_STREAM_END:
1307 : 3308 : break;
1308 : 0 : default:
1309 [ # # # # ]: 0 : if (err == Z_NEED_DICT && self->zdict != NULL) {
1310 [ # # ]: 0 : if (set_inflate_zdict(state, self) < 0) {
1311 : 0 : goto abort;
1312 : : }
1313 : : else
1314 : 0 : break;
1315 : : }
1316 : 0 : goto save;
1317 : : }
1318 : :
1319 [ + + - + ]: 3308 : } while (self->zst.avail_out == 0 || err == Z_NEED_DICT);
1320 : :
1321 [ + + + - ]: 3306 : } while (err != Z_STREAM_END && ibuflen != 0);
1322 : :
1323 : 3306 : save:
1324 [ - + ]: 3306 : if (save_unconsumed_input(self, &data, err) < 0) {
1325 : 0 : goto abort;
1326 : : }
1327 : :
1328 : : /* If at end of stream, clean up any memory allocated by zlib. */
1329 [ + + ]: 3306 : if (err == Z_STREAM_END) {
1330 : 3303 : self->eof = 1;
1331 : 3303 : self->is_initialised = 0;
1332 : 3303 : err = inflateEnd(&self->zst);
1333 [ - + ]: 3303 : if (err != Z_OK) {
1334 : 0 : zlib_error(state, self->zst, err, "while finishing decompression");
1335 : 0 : goto abort;
1336 : : }
1337 : : }
1338 : :
1339 : 3306 : RetVal = OutputBuffer_WindowFinish(&buffer, &window, self->zst.avail_out);
1340 [ + - ]: 3306 : if (RetVal != NULL) {
1341 : 3306 : goto success;
1342 : : }
1343 : :
1344 : 0 : abort:
1345 : 0 : OutputBuffer_WindowOnError(&buffer, &window);
1346 : 0 : RetVal = NULL;
1347 : 3306 : success:
1348 : 3306 : PyBuffer_Release(&data);
1349 : 3306 : LEAVE_ZLIB(self);
1350 : 3306 : 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 *
1397 : 12 : 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 [ - + ]: 12 : if (data->len > 1024*5) {
1403 : 0 : unsigned char *buf = data->buf;
1404 : 0 : Py_ssize_t len = data->len;
1405 : :
1406 : 0 : 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 [ # # ]: 0 : while ((size_t)len > UINT_MAX) {
1410 : 0 : value = adler32(value, buf, UINT_MAX);
1411 : 0 : buf += (size_t) UINT_MAX;
1412 : 0 : len -= (size_t) UINT_MAX;
1413 : : }
1414 : 0 : value = adler32(value, buf, (unsigned int)len);
1415 : 0 : Py_END_ALLOW_THREADS
1416 : : } else {
1417 : 12 : value = adler32(value, data->buf, (unsigned int)data->len);
1418 : : }
1419 : 12 : 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
1436 : 165027 : 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 [ + + ]: 165027 : if (data->len > 1024*5) {
1442 : 15453 : unsigned char *buf = data->buf;
1443 : 15453 : Py_ssize_t len = data->len;
1444 : :
1445 : 15453 : 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 [ - + ]: 15453 : while ((size_t)len > UINT_MAX) {
1449 : 0 : value = crc32(value, buf, UINT_MAX);
1450 : 0 : buf += (size_t) UINT_MAX;
1451 : 0 : len -= (size_t) UINT_MAX;
1452 : : }
1453 : 15453 : value = crc32(value, buf, (unsigned int)len);
1454 : 15453 : Py_END_ALLOW_THREADS
1455 : : } else {
1456 : 149574 : value = crc32(value, data->buf, (unsigned int)data->len);
1457 : : }
1458 : 165027 : 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
1516 : 2866 : zlib_clear(PyObject *mod)
1517 : : {
1518 : 2866 : zlibstate *state = get_zlib_state(mod);
1519 [ + + ]: 2866 : Py_CLEAR(state->Comptype);
1520 [ + + ]: 2866 : Py_CLEAR(state->Decomptype);
1521 [ + + ]: 2866 : Py_CLEAR(state->ZlibError);
1522 : 2866 : return 0;
1523 : : }
1524 : :
1525 : : static int
1526 : 38749 : zlib_traverse(PyObject *mod, visitproc visit, void *arg)
1527 : : {
1528 : 38749 : zlibstate *state = get_zlib_state(mod);
1529 [ + + - + ]: 38749 : Py_VISIT(state->Comptype);
1530 [ + + - + ]: 38749 : Py_VISIT(state->Decomptype);
1531 [ + + - + ]: 38749 : Py_VISIT(state->ZlibError);
1532 : 38749 : return 0;
1533 : : }
1534 : :
1535 : : static void
1536 : 1433 : zlib_free(void *mod)
1537 : : {
1538 : 1433 : zlib_clear((PyObject *)mod);
1539 : 1433 : }
1540 : :
1541 : : static int
1542 : 1433 : zlib_exec(PyObject *mod)
1543 : : {
1544 : 1433 : zlibstate *state = get_zlib_state(mod);
1545 : :
1546 : 1433 : state->Comptype = (PyTypeObject *)PyType_FromModuleAndSpec(
1547 : : mod, &Comptype_spec, NULL);
1548 [ - + ]: 1433 : if (state->Comptype == NULL) {
1549 : 0 : return -1;
1550 : : }
1551 : :
1552 : 1433 : state->Decomptype = (PyTypeObject *)PyType_FromModuleAndSpec(
1553 : : mod, &Decomptype_spec, NULL);
1554 [ - + ]: 1433 : if (state->Decomptype == NULL) {
1555 : 0 : return -1;
1556 : : }
1557 : :
1558 : 1433 : state->ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1559 [ - + ]: 1433 : if (state->ZlibError == NULL) {
1560 : 0 : return -1;
1561 : : }
1562 : :
1563 : 1433 : Py_INCREF(state->ZlibError);
1564 [ - + ]: 1433 : if (PyModule_AddObject(mod, "error", state->ZlibError) < 0) {
1565 : 0 : Py_DECREF(state->ZlibError);
1566 : 0 : 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 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(MAX_WBITS);
1577 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(DEFLATED);
1578 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(DEF_MEM_LEVEL);
1579 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(DEF_BUF_SIZE);
1580 : : // compression levels
1581 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_NO_COMPRESSION);
1582 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_BEST_SPEED);
1583 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_BEST_COMPRESSION);
1584 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_DEFAULT_COMPRESSION);
1585 : : // compression strategies
1586 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_FILTERED);
1587 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_HUFFMAN_ONLY);
1588 : : #ifdef Z_RLE // 1.2.0.1
1589 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_RLE);
1590 : : #endif
1591 : : #ifdef Z_FIXED // 1.2.2.2
1592 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_FIXED);
1593 : : #endif
1594 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_DEFAULT_STRATEGY);
1595 : : // allowed flush values
1596 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_NO_FLUSH);
1597 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_PARTIAL_FLUSH);
1598 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_SYNC_FLUSH);
1599 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_FULL_FLUSH);
1600 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_FINISH);
1601 : : #ifdef Z_BLOCK // 1.2.0.5 for inflate, 1.2.3.4 for deflate
1602 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_BLOCK);
1603 : : #endif
1604 : : #ifdef Z_TREES // 1.2.3.4, only for inflate
1605 [ - + ]: 1433 : ZLIB_ADD_INT_MACRO(Z_TREES);
1606 : : #endif
1607 : 1433 : PyObject *ver = PyUnicode_FromString(ZLIB_VERSION);
1608 [ - + ]: 1433 : if (ver == NULL) {
1609 : 0 : return -1;
1610 : : }
1611 : :
1612 [ - + ]: 1433 : if (PyModule_AddObject(mod, "ZLIB_VERSION", ver) < 0) {
1613 : 0 : Py_DECREF(ver);
1614 : 0 : return -1;
1615 : : }
1616 : :
1617 : 1433 : ver = PyUnicode_FromString(zlibVersion());
1618 [ - + ]: 1433 : if (ver == NULL) {
1619 : 0 : return -1;
1620 : : }
1621 : :
1622 [ - + ]: 1433 : if (PyModule_AddObject(mod, "ZLIB_RUNTIME_VERSION", ver) < 0) {
1623 : 0 : Py_DECREF(ver);
1624 : 0 : return -1;
1625 : : }
1626 : :
1627 [ - + ]: 1433 : if (PyModule_AddStringConstant(mod, "__version__", "1.0") < 0) {
1628 : 0 : return -1;
1629 : : }
1630 : 1433 : 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
1651 : 1433 : PyInit_zlib(void)
1652 : : {
1653 : 1433 : return PyModuleDef_Init(&zlibmodule);
1654 : : }
|