Mercurial > cpython-lru_cache-weakref
annotate Modules/zlibmodule.c @ 49955:878d40468c4e legacy-trunk
Issue #4384: Added logging integration with warnings module using captureWarnings(). This change includes a NullHandler which does nothing; it will be of use to library developers who want to avoid the "No handlers could be found for logger XXX" message which can appear if the library user doesn't configure logging.
| author | Vinay Sajip <vinay_sajip@yahoo.co.uk> |
|---|---|
| date | Wed, 03 Dec 2008 23:22:58 +0000 |
| parents | 52294af4b663 |
| children | b602676cadcd |
| rev | line source |
|---|---|
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 /* zlibmodule.c -- gzip-compatible data compression */ |
|
20327
54f05b9b1fc4
Update URL. Fixes bug #468118.
Martin v. Löwis <martin@v.loewis.de>
parents:
19810
diff
changeset
|
2 /* See http://www.gzip.org/zlib/ */ |
|
16368
c696a52c2621
Fix [ Bug #129293 ] zlib library used for binary win32 distribution can crash
Mark Hammond <mhammond@skippinet.com.au>
parents:
15098
diff
changeset
|
3 |
|
16369
c04ca6cba1e3
Docs for new Windows zlib build procedure.
Tim Peters <tim.peters@gmail.com>
parents:
16368
diff
changeset
|
4 /* Windows users: read Python's PCbuild\readme.txt */ |
|
16368
c696a52c2621
Fix [ Bug #129293 ] zlib library used for binary win32 distribution can crash
Mark Hammond <mhammond@skippinet.com.au>
parents:
15098
diff
changeset
|
5 |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
6 |
|
5723
beee351f1f72
Small changes (casts etc.) by Jack, for Mac compilation.
Guido van Rossum <guido@python.org>
parents:
5722
diff
changeset
|
7 #include "Python.h" |
|
beee351f1f72
Small changes (casts etc.) by Jack, for Mac compilation.
Guido van Rossum <guido@python.org>
parents:
5722
diff
changeset
|
8 #include "zlib.h" |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
9 |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
10 #ifdef WITH_THREAD |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
11 #include "pythread.h" |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
12 |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
13 /* #defs ripped off from _tkinter.c, even though the situation here is much |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
14 simpler, because we don't have to worry about waiting for Tcl |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
15 events! And, since zlib itself is threadsafe, we don't need to worry |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
16 about re-entering zlib functions. |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
17 |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
18 N.B. |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
19 |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
20 Since ENTER_ZLIB and LEAVE_ZLIB only need to be called on functions |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
21 that modify the components of preexisting de/compress objects, it |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
22 could prove to be a performance gain on multiprocessor machines if |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
23 there was an de/compress object-specific lock. However, for the |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
24 moment the ENTER_ZLIB and LEAVE_ZLIB calls are global for ALL |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
25 de/compress objects. |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
26 */ |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
27 |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
28 static PyThread_type_lock zlib_lock = NULL; /* initialized on module load */ |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
29 |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
30 #define ENTER_ZLIB \ |
|
20482
8f473179b073
Removed obsolete comments about confused string refcount tricks (Jeremy
Tim Peters <tim.peters@gmail.com>
parents:
20478
diff
changeset
|
31 Py_BEGIN_ALLOW_THREADS \ |
|
8f473179b073
Removed obsolete comments about confused string refcount tricks (Jeremy
Tim Peters <tim.peters@gmail.com>
parents:
20478
diff
changeset
|
32 PyThread_acquire_lock(zlib_lock, 1); \ |
|
8f473179b073
Removed obsolete comments about confused string refcount tricks (Jeremy
Tim Peters <tim.peters@gmail.com>
parents:
20478
diff
changeset
|
33 Py_END_ALLOW_THREADS |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
34 |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
35 #define LEAVE_ZLIB \ |
|
20482
8f473179b073
Removed obsolete comments about confused string refcount tricks (Jeremy
Tim Peters <tim.peters@gmail.com>
parents:
20478
diff
changeset
|
36 PyThread_release_lock(zlib_lock); |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
37 |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
38 #else |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
39 |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
40 #define ENTER_ZLIB |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
41 #define LEAVE_ZLIB |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
42 |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
43 #endif |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
44 |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
45 /* The following parameters are copied from zutil.h, version 0.95 */ |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
46 #define DEFLATED 8 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
47 #if MAX_MEM_LEVEL >= 8 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
48 # define DEF_MEM_LEVEL 8 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
49 #else |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
50 # define DEF_MEM_LEVEL MAX_MEM_LEVEL |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
51 #endif |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
52 #define DEF_WBITS MAX_WBITS |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
53 |
|
10538
ccee3c28b7ef
Patch by Andrew Kuchling to unflush() (flush() for deflating).
Guido van Rossum <guido@python.org>
parents:
10467
diff
changeset
|
54 /* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */ |
|
ccee3c28b7ef
Patch by Andrew Kuchling to unflush() (flush() for deflating).
Guido van Rossum <guido@python.org>
parents:
10467
diff
changeset
|
55 #define DEFAULTALLOC (16*1024) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
56 #define PyInit_zlib initzlib |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
57 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23832
diff
changeset
|
58 static PyTypeObject Comptype; |
|
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23832
diff
changeset
|
59 static PyTypeObject Decomptype; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
60 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
61 static PyObject *ZlibError; |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
62 |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
63 typedef struct |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
64 { |
| 20469 | 65 PyObject_HEAD |
| 66 z_stream zst; | |
| 67 PyObject *unused_data; | |
| 68 PyObject *unconsumed_tail; | |
| 69 int is_initialised; | |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
70 } compobject; |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
71 |
|
20474
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
72 static void |
|
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
73 zlib_error(z_stream zst, int err, char *msg) |
|
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
74 { |
|
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
75 if (zst.msg == Z_NULL) |
|
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
76 PyErr_Format(ZlibError, "Error %d %s", err, msg); |
|
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
77 else |
|
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
78 PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zst.msg); |
|
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
79 } |
|
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
80 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
81 PyDoc_STRVAR(compressobj__doc__, |
|
20485
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
82 "compressobj([level]) -- Return a compressor object.\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
83 "\n" |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
84 "Optional arg level is the compression level, in 1-9."); |
| 5722 | 85 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
86 PyDoc_STRVAR(decompressobj__doc__, |
|
20485
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
87 "decompressobj([wbits]) -- Return a decompressor object.\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
88 "\n" |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
89 "Optional arg wbits is the window buffer size."); |
| 5722 | 90 |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
91 static compobject * |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
92 newcompobject(PyTypeObject *type) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
93 { |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
94 compobject *self; |
| 20469 | 95 self = PyObject_New(compobject, type); |
| 96 if (self == NULL) | |
| 97 return NULL; | |
| 98 self->is_initialised = 0; | |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
99 self->unused_data = PyString_FromString(""); |
| 20469 | 100 if (self->unused_data == NULL) { |
| 101 Py_DECREF(self); | |
| 102 return NULL; | |
| 103 } | |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
104 self->unconsumed_tail = PyString_FromString(""); |
| 20469 | 105 if (self->unconsumed_tail == NULL) { |
| 106 Py_DECREF(self); | |
| 107 return NULL; | |
| 108 } | |
| 109 return self; | |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
110 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
111 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
112 PyDoc_STRVAR(compress__doc__, |
|
20485
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
113 "compress(string[, level]) -- Returned compressed string.\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
114 "\n" |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
115 "Optional arg level is the compression level, in 1-9."); |
| 5722 | 116 |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
117 static PyObject * |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
118 PyZlib_compress(PyObject *self, PyObject *args) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
119 { |
| 20469 | 120 PyObject *ReturnVal = NULL; |
| 121 Byte *input, *output; | |
| 122 int length, level=Z_DEFAULT_COMPRESSION, err; | |
| 123 z_stream zst; | |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
124 |
| 20469 | 125 /* require Python string object, optional 'level' arg */ |
|
20478
071cfee8d8eb
Undo needless INCREF chicanery introduced by SF patch #450702.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20477
diff
changeset
|
126 if (!PyArg_ParseTuple(args, "s#|i:compress", &input, &length, &level)) |
| 20469 | 127 return NULL; |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
128 |
| 20469 | 129 zst.avail_out = length + length/1000 + 12 + 1; |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
130 |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
131 output = (Byte*)malloc(zst.avail_out); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
132 if (output == NULL) { |
| 20469 | 133 PyErr_SetString(PyExc_MemoryError, |
| 134 "Can't allocate memory to compress data"); | |
| 135 return NULL; | |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
136 } |
| 9657 | 137 |
| 20469 | 138 /* Past the point of no return. From here on out, we need to make sure |
| 139 we clean up mallocs & INCREFs. */ | |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
140 |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
141 zst.zalloc = (alloc_func)NULL; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
142 zst.zfree = (free_func)Z_NULL; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
143 zst.next_out = (Byte *)output; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
144 zst.next_in = (Byte *)input; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
145 zst.avail_in = length; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
146 err = deflateInit(&zst, level); |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
147 |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
148 switch(err) { |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
149 case(Z_OK): |
| 20469 | 150 break; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
151 case(Z_MEM_ERROR): |
| 20469 | 152 PyErr_SetString(PyExc_MemoryError, |
| 153 "Out of memory while compressing data"); | |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
154 goto error; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
155 case(Z_STREAM_ERROR): |
| 20469 | 156 PyErr_SetString(ZlibError, |
| 157 "Bad compression level"); | |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
158 goto error; |
|
20474
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
159 default: |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
160 deflateEnd(&zst); |
|
20474
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
161 zlib_error(zst, err, "while compressing data"); |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
162 goto error; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
163 } |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
164 |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
165 Py_BEGIN_ALLOW_THREADS; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
166 err = deflate(&zst, Z_FINISH); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
167 Py_END_ALLOW_THREADS; |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
168 |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
169 if (err != Z_STREAM_END) { |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
170 zlib_error(zst, err, "while compressing data"); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
171 deflateEnd(&zst); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
172 goto error; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
173 } |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
174 |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
175 err=deflateEnd(&zst); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
176 if (err == Z_OK) |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
177 ReturnVal = PyString_FromStringAndSize((char *)output, |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
178 zst.total_out); |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
179 else |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
180 zlib_error(zst, err, "while finishing compression"); |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
181 |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
182 error: |
| 20469 | 183 free(output); |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
184 |
| 20469 | 185 return ReturnVal; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
186 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
187 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
188 PyDoc_STRVAR(decompress__doc__, |
|
20485
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
189 "decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
190 "\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
191 "Optional arg wbits is the window buffer size. Optional arg bufsize is\n" |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
192 "the initial output buffer size."); |
| 5722 | 193 |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
194 static PyObject * |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
195 PyZlib_decompress(PyObject *self, PyObject *args) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
196 { |
| 20469 | 197 PyObject *result_str; |
| 198 Byte *input; | |
| 199 int length, err; | |
|
43937
883884fdaae8
Fixed #1372: zlibmodule.c: int overflow in PyZlib_decompress
Christian Heimes <christian@cheimes.de>
parents:
42333
diff
changeset
|
200 int wsize=DEF_WBITS; |
|
883884fdaae8
Fixed #1372: zlibmodule.c: int overflow in PyZlib_decompress
Christian Heimes <christian@cheimes.de>
parents:
42333
diff
changeset
|
201 Py_ssize_t r_strlen=DEFAULTALLOC; |
| 20469 | 202 z_stream zst; |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
203 |
|
43937
883884fdaae8
Fixed #1372: zlibmodule.c: int overflow in PyZlib_decompress
Christian Heimes <christian@cheimes.de>
parents:
42333
diff
changeset
|
204 if (!PyArg_ParseTuple(args, "s#|in:decompress", |
|
20478
071cfee8d8eb
Undo needless INCREF chicanery introduced by SF patch #450702.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20477
diff
changeset
|
205 &input, &length, &wsize, &r_strlen)) |
| 20469 | 206 return NULL; |
| 6236 | 207 |
| 20469 | 208 if (r_strlen <= 0) |
| 209 r_strlen = 1; | |
| 9657 | 210 |
| 20469 | 211 zst.avail_in = length; |
| 212 zst.avail_out = r_strlen; | |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
213 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
214 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen))) |
| 20469 | 215 return NULL; |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
216 |
| 20469 | 217 zst.zalloc = (alloc_func)NULL; |
| 218 zst.zfree = (free_func)Z_NULL; | |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
219 zst.next_out = (Byte *)PyString_AS_STRING(result_str); |
| 20469 | 220 zst.next_in = (Byte *)input; |
| 221 err = inflateInit2(&zst, wsize); | |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
222 |
| 20469 | 223 switch(err) { |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
224 case(Z_OK): |
| 20469 | 225 break; |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
226 case(Z_MEM_ERROR): |
| 20469 | 227 PyErr_SetString(PyExc_MemoryError, |
| 228 "Out of memory while decompressing data"); | |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
229 goto error; |
|
20474
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
230 default: |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
231 inflateEnd(&zst); |
|
20474
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
232 zlib_error(zst, err, "while preparing to decompress data"); |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
233 goto error; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
234 } |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
235 |
| 20469 | 236 do { |
| 237 Py_BEGIN_ALLOW_THREADS | |
| 238 err=inflate(&zst, Z_FINISH); | |
| 239 Py_END_ALLOW_THREADS | |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
240 |
| 20469 | 241 switch(err) { |
| 242 case(Z_STREAM_END): | |
| 6007 | 243 break; |
|
8128
fdba6397b729
Tiny patch for zlib 1.1.2
Guido van Rossum <guido@python.org>
parents:
6911
diff
changeset
|
244 case(Z_BUF_ERROR): |
|
15098
7de0808f1fe3
Patch #101810: check whether zst.avail_out is non-zero when getting
Andrew M. Kuchling <amk@amk.ca>
parents:
13816
diff
changeset
|
245 /* |
|
7de0808f1fe3
Patch #101810: check whether zst.avail_out is non-zero when getting
Andrew M. Kuchling <amk@amk.ca>
parents:
13816
diff
changeset
|
246 * If there is at least 1 byte of room according to zst.avail_out |
|
7de0808f1fe3
Patch #101810: check whether zst.avail_out is non-zero when getting
Andrew M. Kuchling <amk@amk.ca>
parents:
13816
diff
changeset
|
247 * and we get this error, assume that it means zlib cannot |
|
7de0808f1fe3
Patch #101810: check whether zst.avail_out is non-zero when getting
Andrew M. Kuchling <amk@amk.ca>
parents:
13816
diff
changeset
|
248 * process the inflate call() due to an error in the data. |
|
7de0808f1fe3
Patch #101810: check whether zst.avail_out is non-zero when getting
Andrew M. Kuchling <amk@amk.ca>
parents:
13816
diff
changeset
|
249 */ |
|
20474
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
250 if (zst.avail_out > 0) { |
| 20469 | 251 PyErr_Format(ZlibError, "Error %i while decompressing data", |
| 252 err); | |
| 253 inflateEnd(&zst); | |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
254 goto error; |
| 20469 | 255 } |
|
15098
7de0808f1fe3
Patch #101810: check whether zst.avail_out is non-zero when getting
Andrew M. Kuchling <amk@amk.ca>
parents:
13816
diff
changeset
|
256 /* fall through */ |
|
7de0808f1fe3
Patch #101810: check whether zst.avail_out is non-zero when getting
Andrew M. Kuchling <amk@amk.ca>
parents:
13816
diff
changeset
|
257 case(Z_OK): |
| 6007 | 258 /* need more memory */ |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
259 if (_PyString_Resize(&result_str, r_strlen << 1) < 0) { |
| 20469 | 260 inflateEnd(&zst); |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
261 goto error; |
| 20469 | 262 } |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
263 zst.next_out = (unsigned char *)PyString_AS_STRING(result_str) \ |
| 20469 | 264 + r_strlen; |
| 265 zst.avail_out = r_strlen; | |
| 6007 | 266 r_strlen = r_strlen << 1; |
| 267 break; | |
|
20474
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
268 default: |
| 20469 | 269 inflateEnd(&zst); |
|
20474
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
270 zlib_error(zst, err, "while decompressing data"); |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
271 goto error; |
| 20469 | 272 } |
| 273 } while (err != Z_STREAM_END); | |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
274 |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
275 err = inflateEnd(&zst); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
276 if (err != Z_OK) { |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
277 zlib_error(zst, err, "while finishing data decompression"); |
|
20478
071cfee8d8eb
Undo needless INCREF chicanery introduced by SF patch #450702.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20477
diff
changeset
|
278 goto error; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
279 } |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
280 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
281 _PyString_Resize(&result_str, zst.total_out); |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
282 return result_str; |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
283 |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
284 error: |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
285 Py_XDECREF(result_str); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
286 return NULL; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
287 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
288 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
289 static PyObject * |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
290 PyZlib_compressobj(PyObject *selfptr, PyObject *args) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
291 { |
| 20475 | 292 compobject *self; |
| 293 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED; | |
| 294 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err; | |
| 6007 | 295 |
| 20475 | 296 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits, |
| 297 &memLevel, &strategy)) | |
| 298 return NULL; | |
| 6007 | 299 |
| 20475 | 300 self = newcompobject(&Comptype); |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
301 if (self==NULL) |
| 20475 | 302 return(NULL); |
| 303 self->zst.zalloc = (alloc_func)NULL; | |
| 304 self->zst.zfree = (free_func)Z_NULL; | |
|
34264
b2ecda4dd70f
[Bug #1083110] calling .flush() on decompress objects causes a segfault due to an uninitialized pointer: fixes the problem and adds a test case
Andrew M. Kuchling <amk@amk.ca>
parents:
27653
diff
changeset
|
305 self->zst.next_in = NULL; |
|
b2ecda4dd70f
[Bug #1083110] calling .flush() on decompress objects causes a segfault due to an uninitialized pointer: fixes the problem and adds a test case
Andrew M. Kuchling <amk@amk.ca>
parents:
27653
diff
changeset
|
306 self->zst.avail_in = 0; |
| 20475 | 307 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy); |
| 308 switch(err) { | |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
309 case (Z_OK): |
| 20475 | 310 self->is_initialised = 1; |
| 311 return (PyObject*)self; | |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
312 case (Z_MEM_ERROR): |
| 20475 | 313 Py_DECREF(self); |
| 314 PyErr_SetString(PyExc_MemoryError, | |
| 315 "Can't allocate memory for compression object"); | |
| 316 return NULL; | |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
317 case(Z_STREAM_ERROR): |
| 20475 | 318 Py_DECREF(self); |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
319 PyErr_SetString(PyExc_ValueError, "Invalid initialization option"); |
| 20475 | 320 return NULL; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
321 default: |
|
20474
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
322 zlib_error(self->zst, err, "while creating compression object"); |
|
10028
167adf31786d
Added missing DECREF's in the error branches when creating a compressor or
Andrew M. Kuchling <amk@amk.ca>
parents:
9995
diff
changeset
|
323 Py_DECREF(self); |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
324 return NULL; |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
325 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
326 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
327 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
328 static PyObject * |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
329 PyZlib_decompressobj(PyObject *selfptr, PyObject *args) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
330 { |
| 20475 | 331 int wbits=DEF_WBITS, err; |
| 332 compobject *self; | |
| 333 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits)) | |
| 334 return NULL; | |
| 335 | |
| 336 self = newcompobject(&Decomptype); | |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
337 if (self == NULL) |
| 20475 | 338 return(NULL); |
| 339 self->zst.zalloc = (alloc_func)NULL; | |
| 340 self->zst.zfree = (free_func)Z_NULL; | |
|
34264
b2ecda4dd70f
[Bug #1083110] calling .flush() on decompress objects causes a segfault due to an uninitialized pointer: fixes the problem and adds a test case
Andrew M. Kuchling <amk@amk.ca>
parents:
27653
diff
changeset
|
341 self->zst.next_in = NULL; |
|
b2ecda4dd70f
[Bug #1083110] calling .flush() on decompress objects causes a segfault due to an uninitialized pointer: fixes the problem and adds a test case
Andrew M. Kuchling <amk@amk.ca>
parents:
27653
diff
changeset
|
342 self->zst.avail_in = 0; |
| 20475 | 343 err = inflateInit2(&self->zst, wbits); |
| 344 switch(err) { | |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
345 case (Z_OK): |
| 20475 | 346 self->is_initialised = 1; |
| 347 return (PyObject*)self; | |
| 6236 | 348 case(Z_STREAM_ERROR): |
| 20475 | 349 Py_DECREF(self); |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
350 PyErr_SetString(PyExc_ValueError, "Invalid initialization option"); |
| 20475 | 351 return NULL; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
352 case (Z_MEM_ERROR): |
| 20475 | 353 Py_DECREF(self); |
| 354 PyErr_SetString(PyExc_MemoryError, | |
| 355 "Can't allocate memory for decompression object"); | |
| 356 return NULL; | |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
357 default: |
|
20474
a5a30ba2899f
Add zlib_error() helper.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20470
diff
changeset
|
358 zlib_error(self->zst, err, "while creating decompression object"); |
|
10028
167adf31786d
Added missing DECREF's in the error branches when creating a compressor or
Andrew M. Kuchling <amk@amk.ca>
parents:
9995
diff
changeset
|
359 Py_DECREF(self); |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
360 return NULL; |
| 20475 | 361 } |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
362 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
363 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
364 static void |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
365 Comp_dealloc(compobject *self) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
366 { |
|
10028
167adf31786d
Added missing DECREF's in the error branches when creating a compressor or
Andrew M. Kuchling <amk@amk.ca>
parents:
9995
diff
changeset
|
367 if (self->is_initialised) |
| 20475 | 368 deflateEnd(&self->zst); |
|
10467
255abab3c574
Add an .unused_data attribute to decompressor objects. If .unused_data
Andrew M. Kuchling <amk@amk.ca>
parents:
10440
diff
changeset
|
369 Py_XDECREF(self->unused_data); |
|
20466
60e12f83d2d2
[ #403753 ] zlib decompress; uncontrollable memory usage
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20327
diff
changeset
|
370 Py_XDECREF(self->unconsumed_tail); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12255
diff
changeset
|
371 PyObject_Del(self); |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
372 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
373 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
374 static void |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
375 Decomp_dealloc(compobject *self) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
376 { |
|
16718
01c2470eeb2e
Patch #103373 from Donovan Baarda: This patch:
Andrew M. Kuchling <amk@amk.ca>
parents:
16369
diff
changeset
|
377 if (self->is_initialised) |
| 20475 | 378 inflateEnd(&self->zst); |
|
10467
255abab3c574
Add an .unused_data attribute to decompressor objects. If .unused_data
Andrew M. Kuchling <amk@amk.ca>
parents:
10440
diff
changeset
|
379 Py_XDECREF(self->unused_data); |
|
20466
60e12f83d2d2
[ #403753 ] zlib decompress; uncontrollable memory usage
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20327
diff
changeset
|
380 Py_XDECREF(self->unconsumed_tail); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
12255
diff
changeset
|
381 PyObject_Del(self); |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
382 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
383 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
384 PyDoc_STRVAR(comp_compress__doc__, |
|
20485
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
385 "compress(data) -- Return a string containing data compressed.\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
386 "\n" |
| 5722 | 387 "After calling this function, some of the input data may still\n" |
| 388 "be stored in internal buffers for later processing.\n" | |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
389 "Call the flush() method to clear these buffers."); |
| 5722 | 390 |
| 391 | |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
392 static PyObject * |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
393 PyZlib_objcompress(compobject *self, PyObject *args) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
394 { |
| 20469 | 395 int err, inplen, length = DEFAULTALLOC; |
| 396 PyObject *RetVal; | |
| 397 Byte *input; | |
| 398 unsigned long start_total_out; | |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
399 |
|
20478
071cfee8d8eb
Undo needless INCREF chicanery introduced by SF patch #450702.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20477
diff
changeset
|
400 if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen)) |
| 20469 | 401 return NULL; |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
402 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
403 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) |
| 20469 | 404 return NULL; |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
405 |
| 20469 | 406 ENTER_ZLIB |
| 407 | |
| 408 start_total_out = self->zst.total_out; | |
| 409 self->zst.avail_in = inplen; | |
| 410 self->zst.next_in = input; | |
|
16718
01c2470eeb2e
Patch #103373 from Donovan Baarda: This patch:
Andrew M. Kuchling <amk@amk.ca>
parents:
16369
diff
changeset
|
411 self->zst.avail_out = length; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
412 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal); |
| 20469 | 413 |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
414 Py_BEGIN_ALLOW_THREADS |
|
16718
01c2470eeb2e
Patch #103373 from Donovan Baarda: This patch:
Andrew M. Kuchling <amk@amk.ca>
parents:
16369
diff
changeset
|
415 err = deflate(&(self->zst), Z_NO_FLUSH); |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
416 Py_END_ALLOW_THREADS |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
417 |
| 20469 | 418 /* while Z_OK and the output buffer is full, there might be more output, |
| 419 so extend the output buffer and try again */ | |
| 420 while (err == Z_OK && self->zst.avail_out == 0) { | |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
421 if (_PyString_Resize(&RetVal, length << 1) < 0) |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
422 goto error; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
423 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \ |
| 20469 | 424 + length; |
| 425 self->zst.avail_out = length; | |
| 426 length = length << 1; | |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
427 |
| 20469 | 428 Py_BEGIN_ALLOW_THREADS |
| 429 err = deflate(&(self->zst), Z_NO_FLUSH); | |
| 430 Py_END_ALLOW_THREADS | |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
431 } |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
432 /* We will only get Z_BUF_ERROR if the output buffer was full but |
| 20469 | 433 there wasn't more output when we tried again, so it is not an error |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
434 condition. |
|
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
435 */ |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
436 |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
437 if (err != Z_OK && err != Z_BUF_ERROR) { |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
438 zlib_error(self->zst, err, "while compressing"); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
439 Py_DECREF(RetVal); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
440 RetVal = NULL; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
441 goto error; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
442 } |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
443 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out); |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
444 |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
445 error: |
| 20469 | 446 LEAVE_ZLIB |
| 447 return RetVal; | |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
448 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
449 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
450 PyDoc_STRVAR(decomp_decompress__doc__, |
|
20485
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
451 "decompress(data, max_length) -- Return a string containing the decompressed\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
452 "version of the data.\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
453 "\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
454 "After calling this function, some of the input data may still be stored in\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
455 "internal buffers for later processing.\n" |
|
20466
60e12f83d2d2
[ #403753 ] zlib decompress; uncontrollable memory usage
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20327
diff
changeset
|
456 "Call the flush() method to clear these buffers.\n" |
|
60e12f83d2d2
[ #403753 ] zlib decompress; uncontrollable memory usage
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20327
diff
changeset
|
457 "If the max_length parameter is specified then the return value will be\n" |
|
60e12f83d2d2
[ #403753 ] zlib decompress; uncontrollable memory usage
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20327
diff
changeset
|
458 "no longer than max_length. Unconsumed input data will be stored in\n" |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
459 "the unconsumed_tail attribute."); |
| 5722 | 460 |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
461 static PyObject * |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
462 PyZlib_objdecompress(compobject *self, PyObject *args) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
463 { |
| 20469 | 464 int err, inplen, old_length, length = DEFAULTALLOC; |
| 465 int max_length = 0; | |
| 466 PyObject *RetVal; | |
| 467 Byte *input; | |
| 468 unsigned long start_total_out; | |
|
20466
60e12f83d2d2
[ #403753 ] zlib decompress; uncontrollable memory usage
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20327
diff
changeset
|
469 |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
470 if (!PyArg_ParseTuple(args, "s#|i:decompress", &input, |
|
20478
071cfee8d8eb
Undo needless INCREF chicanery introduced by SF patch #450702.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20477
diff
changeset
|
471 &inplen, &max_length)) |
| 20469 | 472 return NULL; |
| 473 if (max_length < 0) { | |
| 474 PyErr_SetString(PyExc_ValueError, | |
| 475 "max_length must be greater than zero"); | |
| 476 return NULL; | |
| 477 } | |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
478 |
| 20469 | 479 /* limit amount of data allocated to max_length */ |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
480 if (max_length && length > max_length) |
| 20469 | 481 length = max_length; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
482 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) |
| 20469 | 483 return NULL; |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
484 |
| 20469 | 485 ENTER_ZLIB |
| 486 | |
| 487 start_total_out = self->zst.total_out; | |
| 488 self->zst.avail_in = inplen; | |
| 489 self->zst.next_in = input; | |
| 490 self->zst.avail_out = length; | |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
491 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal); |
|
20466
60e12f83d2d2
[ #403753 ] zlib decompress; uncontrollable memory usage
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20327
diff
changeset
|
492 |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
493 Py_BEGIN_ALLOW_THREADS |
|
16718
01c2470eeb2e
Patch #103373 from Donovan Baarda: This patch:
Andrew M. Kuchling <amk@amk.ca>
parents:
16369
diff
changeset
|
494 err = inflate(&(self->zst), Z_SYNC_FLUSH); |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
495 Py_END_ALLOW_THREADS |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
496 |
| 20469 | 497 /* While Z_OK and the output buffer is full, there might be more output. |
| 498 So extend the output buffer and try again. | |
| 499 */ | |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
500 while (err == Z_OK && self->zst.avail_out == 0) { |
| 20469 | 501 /* If max_length set, don't continue decompressing if we've already |
| 502 reached the limit. | |
| 503 */ | |
| 504 if (max_length && length >= max_length) | |
| 505 break; | |
| 506 | |
| 507 /* otherwise, ... */ | |
| 508 old_length = length; | |
| 509 length = length << 1; | |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
510 if (max_length && length > max_length) |
| 20469 | 511 length = max_length; |
|
20466
60e12f83d2d2
[ #403753 ] zlib decompress; uncontrollable memory usage
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20327
diff
changeset
|
512 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
513 if (_PyString_Resize(&RetVal, length) < 0) |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
514 goto error; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
515 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \ |
| 20469 | 516 + old_length; |
| 517 self->zst.avail_out = length - old_length; | |
| 518 | |
| 519 Py_BEGIN_ALLOW_THREADS | |
| 520 err = inflate(&(self->zst), Z_SYNC_FLUSH); | |
| 521 Py_END_ALLOW_THREADS | |
| 522 } | |
| 523 | |
|
34264
b2ecda4dd70f
[Bug #1083110] calling .flush() on decompress objects causes a segfault due to an uninitialized pointer: fixes the problem and adds a test case
Andrew M. Kuchling <amk@amk.ca>
parents:
27653
diff
changeset
|
524 /* Not all of the compressed data could be accommodated in the output buffer |
| 20469 | 525 of specified size. Return the unconsumed tail in an attribute.*/ |
| 526 if(max_length) { | |
| 527 Py_DECREF(self->unconsumed_tail); | |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
528 self->unconsumed_tail = PyString_FromStringAndSize((char *)self->zst.next_in, |
| 20469 | 529 self->zst.avail_in); |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
530 if(!self->unconsumed_tail) { |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
531 Py_DECREF(RetVal); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
532 RetVal = NULL; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
533 goto error; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
534 } |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
535 } |
| 20469 | 536 |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
537 /* The end of the compressed data has been reached, so set the |
|
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
538 unused_data attribute to a string containing the remainder of the |
|
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
539 data in the string. Note that this is also a logical place to call |
| 20469 | 540 inflateEnd, but the old behaviour of only calling it on flush() is |
| 541 preserved. | |
| 542 */ | |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
543 if (err == Z_STREAM_END) { |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
544 Py_XDECREF(self->unused_data); /* Free original empty string */ |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
545 self->unused_data = PyString_FromStringAndSize( |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
546 (char *)self->zst.next_in, self->zst.avail_in); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
547 if (self->unused_data == NULL) { |
| 20469 | 548 Py_DECREF(RetVal); |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
549 goto error; |
| 20469 | 550 } |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
551 /* We will only get Z_BUF_ERROR if the output buffer was full |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
552 but there wasn't more output when we tried again, so it is |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
553 not an error condition. |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
554 */ |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
555 } else if (err != Z_OK && err != Z_BUF_ERROR) { |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
556 zlib_error(self->zst, err, "while decompressing"); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
557 Py_DECREF(RetVal); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
558 RetVal = NULL; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
559 goto error; |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
560 } |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
561 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
562 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out); |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
563 |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
564 error: |
| 20469 | 565 LEAVE_ZLIB |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
566 |
| 20469 | 567 return RetVal; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
568 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
569 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
570 PyDoc_STRVAR(comp_flush__doc__, |
| 9657 | 571 "flush( [mode] ) -- Return a string containing any remaining compressed data.\n" |
|
20485
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
572 "\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
573 "mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n" |
| 9657 | 574 "default value used when mode is not specified is Z_FINISH.\n" |
| 575 "If mode == Z_FINISH, the compressor object can no longer be used after\n" | |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
576 "calling the flush() method. Otherwise, more data can still be compressed."); |
| 5722 | 577 |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
578 static PyObject * |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
579 PyZlib_flush(compobject *self, PyObject *args) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
580 { |
| 20469 | 581 int err, length = DEFAULTALLOC; |
| 582 PyObject *RetVal; | |
| 583 int flushmode = Z_FINISH; | |
| 584 unsigned long start_total_out; | |
| 9657 | 585 |
| 20469 | 586 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode)) |
| 587 return NULL; | |
| 9657 | 588 |
| 20469 | 589 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in |
| 590 doing any work at all; just return an empty string. */ | |
| 591 if (flushmode == Z_NO_FLUSH) { | |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
592 return PyString_FromStringAndSize(NULL, 0); |
| 20469 | 593 } |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
594 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
595 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) |
| 20469 | 596 return NULL; |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
597 |
| 20469 | 598 ENTER_ZLIB |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
599 |
| 20469 | 600 start_total_out = self->zst.total_out; |
| 601 self->zst.avail_in = 0; | |
|
16718
01c2470eeb2e
Patch #103373 from Donovan Baarda: This patch:
Andrew M. Kuchling <amk@amk.ca>
parents:
16369
diff
changeset
|
602 self->zst.avail_out = length; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
603 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal); |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
604 |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
605 Py_BEGIN_ALLOW_THREADS |
|
16718
01c2470eeb2e
Patch #103373 from Donovan Baarda: This patch:
Andrew M. Kuchling <amk@amk.ca>
parents:
16369
diff
changeset
|
606 err = deflate(&(self->zst), flushmode); |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
607 Py_END_ALLOW_THREADS |
| 20469 | 608 |
| 609 /* while Z_OK and the output buffer is full, there might be more output, | |
| 610 so extend the output buffer and try again */ | |
| 611 while (err == Z_OK && self->zst.avail_out == 0) { | |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
612 if (_PyString_Resize(&RetVal, length << 1) < 0) |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
613 goto error; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
614 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \ |
| 20469 | 615 + length; |
| 616 self->zst.avail_out = length; | |
| 617 length = length << 1; | |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
618 |
| 20469 | 619 Py_BEGIN_ALLOW_THREADS |
| 620 err = deflate(&(self->zst), flushmode); | |
| 621 Py_END_ALLOW_THREADS | |
| 622 } | |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
623 |
| 20469 | 624 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
625 various data structures. Note we should only get Z_STREAM_END when |
| 20469 | 626 flushmode is Z_FINISH, but checking both for safety*/ |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
627 if (err == Z_STREAM_END && flushmode == Z_FINISH) { |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
628 err = deflateEnd(&(self->zst)); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
629 if (err != Z_OK) { |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
630 zlib_error(self->zst, err, "from deflateEnd()"); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
631 Py_DECREF(RetVal); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
632 RetVal = NULL; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
633 goto error; |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
634 } |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
635 else |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
636 self->is_initialised = 0; |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
637 |
|
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
638 /* We will only get Z_BUF_ERROR if the output buffer was full |
|
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
639 but there wasn't more output when we tried again, so it is |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
640 not an error condition. |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
641 */ |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
642 } else if (err!=Z_OK && err!=Z_BUF_ERROR) { |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
643 zlib_error(self->zst, err, "while flushing"); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
644 Py_DECREF(RetVal); |
|
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
645 RetVal = NULL; |
|
23169
713ff889d094
Fix SF #544995 (zlib crash on second flush call)
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
22729
diff
changeset
|
646 goto error; |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
647 } |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
648 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
649 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out); |
| 20469 | 650 |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
651 error: |
|
20483
5d678356c894
Removed more comments that didn't make much sense.
Tim Peters <tim.peters@gmail.com>
parents:
20482
diff
changeset
|
652 LEAVE_ZLIB |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
653 |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
654 return RetVal; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
655 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
656 |
|
38771
618d088d9668
Patch #1503046, Conditional compilation of zlib.(de)compressobj.copy
Neal Norwitz <nnorwitz@gmail.com>
parents:
38198
diff
changeset
|
657 #ifdef HAVE_ZLIB_COPY |
|
38190
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
658 PyDoc_STRVAR(comp_copy__doc__, |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
659 "copy() -- Return a copy of the compression object."); |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
660 |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
661 static PyObject * |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
662 PyZlib_copy(compobject *self) |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
663 { |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
664 compobject *retval = NULL; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
665 int err; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
666 |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
667 retval = newcompobject(&Comptype); |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
668 if (!retval) return NULL; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
669 |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
670 /* Copy the zstream state |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
671 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
672 */ |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
673 ENTER_ZLIB |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
674 err = deflateCopy(&retval->zst, &self->zst); |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
675 switch(err) { |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
676 case(Z_OK): |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
677 break; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
678 case(Z_STREAM_ERROR): |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
679 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state"); |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
680 goto error; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
681 case(Z_MEM_ERROR): |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
682 PyErr_SetString(PyExc_MemoryError, |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
683 "Can't allocate memory for compression object"); |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
684 goto error; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
685 default: |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
686 zlib_error(self->zst, err, "while copying compression object"); |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
687 goto error; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
688 } |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
689 |
|
38198
30188c523bc5
PyZlib_copy(), PyZlib_uncopy(): Repair leaks on the normal-case path.
Tim Peters <tim.peters@gmail.com>
parents:
38190
diff
changeset
|
690 Py_INCREF(self->unused_data); |
|
30188c523bc5
PyZlib_copy(), PyZlib_uncopy(): Repair leaks on the normal-case path.
Tim Peters <tim.peters@gmail.com>
parents:
38190
diff
changeset
|
691 Py_INCREF(self->unconsumed_tail); |
|
30188c523bc5
PyZlib_copy(), PyZlib_uncopy(): Repair leaks on the normal-case path.
Tim Peters <tim.peters@gmail.com>
parents:
38190
diff
changeset
|
692 Py_XDECREF(retval->unused_data); |
|
30188c523bc5
PyZlib_copy(), PyZlib_uncopy(): Repair leaks on the normal-case path.
Tim Peters <tim.peters@gmail.com>
parents:
38190
diff
changeset
|
693 Py_XDECREF(retval->unconsumed_tail); |
|
38190
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
694 retval->unused_data = self->unused_data; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
695 retval->unconsumed_tail = self->unconsumed_tail; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
696 |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
697 /* Mark it as being initialized */ |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
698 retval->is_initialised = 1; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
699 |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
700 LEAVE_ZLIB |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
701 return (PyObject *)retval; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
702 |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
703 error: |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
704 LEAVE_ZLIB |
|
38198
30188c523bc5
PyZlib_copy(), PyZlib_uncopy(): Repair leaks on the normal-case path.
Tim Peters <tim.peters@gmail.com>
parents:
38190
diff
changeset
|
705 Py_XDECREF(retval); |
|
38190
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
706 return NULL; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
707 } |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
708 |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
709 PyDoc_STRVAR(decomp_copy__doc__, |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
710 "copy() -- Return a copy of the decompression object."); |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
711 |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
712 static PyObject * |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
713 PyZlib_uncopy(compobject *self) |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
714 { |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
715 compobject *retval = NULL; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
716 int err; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
717 |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
718 retval = newcompobject(&Decomptype); |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
719 if (!retval) return NULL; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
720 |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
721 /* Copy the zstream state |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
722 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
723 */ |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
724 ENTER_ZLIB |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
725 err = inflateCopy(&retval->zst, &self->zst); |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
726 switch(err) { |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
727 case(Z_OK): |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
728 break; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
729 case(Z_STREAM_ERROR): |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
730 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state"); |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
731 goto error; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
732 case(Z_MEM_ERROR): |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
733 PyErr_SetString(PyExc_MemoryError, |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
734 "Can't allocate memory for decompression object"); |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
735 goto error; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
736 default: |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
737 zlib_error(self->zst, err, "while copying decompression object"); |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
738 goto error; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
739 } |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
740 |
|
38198
30188c523bc5
PyZlib_copy(), PyZlib_uncopy(): Repair leaks on the normal-case path.
Tim Peters <tim.peters@gmail.com>
parents:
38190
diff
changeset
|
741 Py_INCREF(self->unused_data); |
|
30188c523bc5
PyZlib_copy(), PyZlib_uncopy(): Repair leaks on the normal-case path.
Tim Peters <tim.peters@gmail.com>
parents:
38190
diff
changeset
|
742 Py_INCREF(self->unconsumed_tail); |
|
30188c523bc5
PyZlib_copy(), PyZlib_uncopy(): Repair leaks on the normal-case path.
Tim Peters <tim.peters@gmail.com>
parents:
38190
diff
changeset
|
743 Py_XDECREF(retval->unused_data); |
|
30188c523bc5
PyZlib_copy(), PyZlib_uncopy(): Repair leaks on the normal-case path.
Tim Peters <tim.peters@gmail.com>
parents:
38190
diff
changeset
|
744 Py_XDECREF(retval->unconsumed_tail); |
|
38190
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
745 retval->unused_data = self->unused_data; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
746 retval->unconsumed_tail = self->unconsumed_tail; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
747 |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
748 /* Mark it as being initialized */ |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
749 retval->is_initialised = 1; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
750 |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
751 LEAVE_ZLIB |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
752 return (PyObject *)retval; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
753 |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
754 error: |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
755 LEAVE_ZLIB |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
756 Py_XDECREF(retval); |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
757 return NULL; |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
758 } |
|
38771
618d088d9668
Patch #1503046, Conditional compilation of zlib.(de)compressobj.copy
Neal Norwitz <nnorwitz@gmail.com>
parents:
38198
diff
changeset
|
759 #endif |
|
38190
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
760 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
761 PyDoc_STRVAR(decomp_flush__doc__, |
|
37373
f64812b2b5c1
Patch #1459631: documnent zlib.Decompress.flush() length parameter.
Georg Brandl <georg@python.org>
parents:
36324
diff
changeset
|
762 "flush( [length] ) -- Return a string containing any remaining\n" |
|
f64812b2b5c1
Patch #1459631: documnent zlib.Decompress.flush() length parameter.
Georg Brandl <georg@python.org>
parents:
36324
diff
changeset
|
763 "decompressed data. length, if given, is the initial size of the\n" |
|
f64812b2b5c1
Patch #1459631: documnent zlib.Decompress.flush() length parameter.
Georg Brandl <georg@python.org>
parents:
36324
diff
changeset
|
764 "output buffer.\n" |
|
20485
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
765 "\n" |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
766 "The decompressor object can no longer be used after this call."); |
| 5722 | 767 |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
768 static PyObject * |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
769 PyZlib_unflush(compobject *self, PyObject *args) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
770 { |
|
27653
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
771 int err, length = DEFAULTALLOC; |
|
20477
c23989e22ffa
Simplify and fix error handling for most cases.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20475
diff
changeset
|
772 PyObject * retval = NULL; |
|
27653
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
773 unsigned long start_total_out; |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
774 |
|
27653
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
775 if (!PyArg_ParseTuple(args, "|i:flush", &length)) |
| 20469 | 776 return NULL; |
|
46363
27c7139a98ef
Fix zlib crash from zlib.decompressobj().flush(val) when val was not positive.
Gregory P. Smith <greg@mad-scientist.com>
parents:
46070
diff
changeset
|
777 if (length <= 0) { |
|
27c7139a98ef
Fix zlib crash from zlib.decompressobj().flush(val) when val was not positive.
Gregory P. Smith <greg@mad-scientist.com>
parents:
46070
diff
changeset
|
778 PyErr_SetString(PyExc_ValueError, "length must be greater than zero"); |
|
27c7139a98ef
Fix zlib crash from zlib.decompressobj().flush(val) when val was not positive.
Gregory P. Smith <greg@mad-scientist.com>
parents:
46070
diff
changeset
|
779 return NULL; |
|
27c7139a98ef
Fix zlib crash from zlib.decompressobj().flush(val) when val was not positive.
Gregory P. Smith <greg@mad-scientist.com>
parents:
46070
diff
changeset
|
780 } |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
781 if (!(retval = PyString_FromStringAndSize(NULL, length))) |
|
27653
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
782 return NULL; |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
783 |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
784 |
| 20469 | 785 ENTER_ZLIB |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
786 |
|
27653
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
787 start_total_out = self->zst.total_out; |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
788 self->zst.avail_out = length; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
789 self->zst.next_out = (Byte *)PyString_AS_STRING(retval); |
|
27653
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
790 |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
791 Py_BEGIN_ALLOW_THREADS |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
792 err = inflate(&(self->zst), Z_FINISH); |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
793 Py_END_ALLOW_THREADS |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
794 |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
795 /* while Z_OK and the output buffer is full, there might be more output, |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
796 so extend the output buffer and try again */ |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
797 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
798 if (_PyString_Resize(&retval, length << 1) < 0) |
|
27653
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
799 goto error; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
800 self->zst.next_out = (Byte *)PyString_AS_STRING(retval) + length; |
|
27653
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
801 self->zst.avail_out = length; |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
802 length = length << 1; |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
803 |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
804 Py_BEGIN_ALLOW_THREADS |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
805 err = inflate(&(self->zst), Z_FINISH); |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
806 Py_END_ALLOW_THREADS |
| 20469 | 807 } |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
808 |
|
27653
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
809 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
810 various data structures. Note we should only get Z_STREAM_END when |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
811 flushmode is Z_FINISH */ |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
812 if (err == Z_STREAM_END) { |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
813 err = inflateEnd(&(self->zst)); |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
814 self->is_initialised = 0; |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
815 if (err != Z_OK) { |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
816 zlib_error(self->zst, err, "from inflateEnd()"); |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
817 Py_DECREF(retval); |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
818 retval = NULL; |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
819 goto error; |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
820 } |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
821 } |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
822 _PyString_Resize(&retval, self->zst.total_out - start_total_out); |
|
27653
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
823 |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
824 error: |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
825 |
| 20469 | 826 LEAVE_ZLIB |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
827 |
| 20469 | 828 return retval; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
829 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
830 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
831 static PyMethodDef comp_methods[] = |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
832 { |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
833 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS, |
| 20469 | 834 comp_compress__doc__}, |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
835 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS, |
| 20469 | 836 comp_flush__doc__}, |
|
38771
618d088d9668
Patch #1503046, Conditional compilation of zlib.(de)compressobj.copy
Neal Norwitz <nnorwitz@gmail.com>
parents:
38198
diff
changeset
|
837 #ifdef HAVE_ZLIB_COPY |
|
38190
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
838 {"copy", (PyCFunction)PyZlib_copy, METH_NOARGS, |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
839 comp_copy__doc__}, |
|
38771
618d088d9668
Patch #1503046, Conditional compilation of zlib.(de)compressobj.copy
Neal Norwitz <nnorwitz@gmail.com>
parents:
38198
diff
changeset
|
840 #endif |
| 20469 | 841 {NULL, NULL} |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
842 }; |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
843 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
844 static PyMethodDef Decomp_methods[] = |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
845 { |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
846 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS, |
| 20469 | 847 decomp_decompress__doc__}, |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
848 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS, |
| 20469 | 849 decomp_flush__doc__}, |
|
38771
618d088d9668
Patch #1503046, Conditional compilation of zlib.(de)compressobj.copy
Neal Norwitz <nnorwitz@gmail.com>
parents:
38198
diff
changeset
|
850 #ifdef HAVE_ZLIB_COPY |
|
38190
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
851 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS, |
|
d6d879af36d3
Patch #1435422: zlib's compress and decompress objects now have a
Georg Brandl <georg@python.org>
parents:
37373
diff
changeset
|
852 decomp_copy__doc__}, |
|
38771
618d088d9668
Patch #1503046, Conditional compilation of zlib.(de)compressobj.copy
Neal Norwitz <nnorwitz@gmail.com>
parents:
38198
diff
changeset
|
853 #endif |
| 20469 | 854 {NULL, NULL} |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
855 }; |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
856 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
857 static PyObject * |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
858 Comp_getattr(compobject *self, char *name) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
859 { |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
860 /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
861 internal data. */ |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
862 |
|
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
863 return Py_FindMethod(comp_methods, (PyObject *)self, name); |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
864 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
865 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
866 static PyObject * |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
867 Decomp_getattr(compobject *self, char *name) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
868 { |
| 20469 | 869 PyObject * retval; |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
870 |
| 20469 | 871 ENTER_ZLIB |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
872 |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
873 if (strcmp(name, "unused_data") == 0) { |
| 20469 | 874 Py_INCREF(self->unused_data); |
| 875 retval = self->unused_data; | |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
876 } else if (strcmp(name, "unconsumed_tail") == 0) { |
| 20469 | 877 Py_INCREF(self->unconsumed_tail); |
| 878 retval = self->unconsumed_tail; | |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
879 } else |
| 20469 | 880 retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name); |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
881 |
| 20469 | 882 LEAVE_ZLIB |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
883 |
| 20469 | 884 return retval; |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
885 } |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
886 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
887 PyDoc_STRVAR(adler32__doc__, |
|
20485
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
888 "adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
889 "\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
890 "An optional starting value can be specified. The returned checksum is\n" |
|
45798
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
891 "a signed integer."); |
| 5722 | 892 |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
893 static PyObject * |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
894 PyZlib_adler32(PyObject *self, PyObject *args) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
895 { |
|
46070
4f9ca827a7d8
Use a 32-bit unsigned int here, a long is not needed.
Gregory P. Smith <greg@mad-scientist.com>
parents:
46035
diff
changeset
|
896 unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */ |
| 6236 | 897 Byte *buf; |
|
46031
c1fc6e0a94b9
Revert r61779 - It undid correct code and caused test_zlib to fail on all
Gregory P. Smith <greg@mad-scientist.com>
parents:
46022
diff
changeset
|
898 int len, signed_val; |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
899 |
|
46070
4f9ca827a7d8
Use a 32-bit unsigned int here, a long is not needed.
Gregory P. Smith <greg@mad-scientist.com>
parents:
46035
diff
changeset
|
900 if (!PyArg_ParseTuple(args, "s#|I:adler32", &buf, &len, &adler32val)) |
| 6236 | 901 return NULL; |
|
45798
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
902 /* In Python 2.x we return a signed integer regardless of native platform |
|
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
903 * long size (the 32bit unsigned long is treated as 32-bit signed and sign |
|
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
904 * extended into a 64-bit long inside the integer object). 3.0 does the |
|
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
905 * right thing and returns unsigned. http://bugs.python.org/issue1202 */ |
|
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
906 signed_val = adler32(adler32val, buf, len); |
|
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
907 return PyInt_FromLong(signed_val); |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
908 } |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
909 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
910 PyDoc_STRVAR(crc32__doc__, |
|
20485
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
911 "crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
912 "\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
913 "An optional starting value can be specified. The returned checksum is\n" |
|
45798
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
914 "a signed integer."); |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
915 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
916 static PyObject * |
|
13496
03bc51e43f7a
ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents:
12576
diff
changeset
|
917 PyZlib_crc32(PyObject *self, PyObject *args) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
918 { |
|
46070
4f9ca827a7d8
Use a 32-bit unsigned int here, a long is not needed.
Gregory P. Smith <greg@mad-scientist.com>
parents:
46035
diff
changeset
|
919 unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */ |
| 6236 | 920 Byte *buf; |
|
46031
c1fc6e0a94b9
Revert r61779 - It undid correct code and caused test_zlib to fail on all
Gregory P. Smith <greg@mad-scientist.com>
parents:
46022
diff
changeset
|
921 int len, signed_val; |
|
45798
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
922 |
|
46070
4f9ca827a7d8
Use a 32-bit unsigned int here, a long is not needed.
Gregory P. Smith <greg@mad-scientist.com>
parents:
46035
diff
changeset
|
923 if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val)) |
| 6236 | 924 return NULL; |
|
45798
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
925 /* In Python 2.x we return a signed integer regardless of native platform |
|
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
926 * long size (the 32bit unsigned long is treated as 32-bit signed and sign |
|
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
927 * extended into a 64-bit long inside the integer object). 3.0 does the |
|
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
928 * right thing and returns unsigned. http://bugs.python.org/issue1202 */ |
|
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
929 signed_val = crc32(crc32val, buf, len); |
|
710478a1977a
Force zlib.crc32 and zlib.adler32 to return a signed integer on all platforms
Gregory P. Smith <greg@mad-scientist.com>
parents:
44350
diff
changeset
|
930 return PyInt_FromLong(signed_val); |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
931 } |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
932 |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
933 |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
934 static PyMethodDef zlib_methods[] = |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
935 { |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
936 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS, |
| 20469 | 937 adler32__doc__}, |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
938 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS, |
| 20469 | 939 compress__doc__}, |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
940 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS, |
| 20469 | 941 compressobj__doc__}, |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
942 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS, |
|
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
943 crc32__doc__}, |
|
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
944 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS, |
| 20469 | 945 decompress__doc__}, |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
946 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS, |
| 20469 | 947 decompressobj__doc__}, |
| 948 {NULL, NULL} | |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
949 }; |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
950 |
|
24283
c0a67a1cab09
Removed more stray instances of statichere, but left _sre.c alone.
Tim Peters <tim.peters@gmail.com>
parents:
24280
diff
changeset
|
951 static PyTypeObject Comptype = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
38771
diff
changeset
|
952 PyVarObject_HEAD_INIT(0, 0) |
|
21313
91dd223829c6
Patch supplied by Burton Radons for his own SF bug #487390: Modifying
Guido van Rossum <guido@python.org>
parents:
20644
diff
changeset
|
953 "zlib.Compress", |
| 20469 | 954 sizeof(compobject), |
| 955 0, | |
| 956 (destructor)Comp_dealloc, /*tp_dealloc*/ | |
| 957 0, /*tp_print*/ | |
| 958 (getattrfunc)Comp_getattr, /*tp_getattr*/ | |
| 959 0, /*tp_setattr*/ | |
| 960 0, /*tp_compare*/ | |
| 961 0, /*tp_repr*/ | |
| 962 0, /*tp_as_number*/ | |
| 963 0, /*tp_as_sequence*/ | |
| 964 0, /*tp_as_mapping*/ | |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
965 }; |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
966 |
|
24283
c0a67a1cab09
Removed more stray instances of statichere, but left _sre.c alone.
Tim Peters <tim.peters@gmail.com>
parents:
24280
diff
changeset
|
967 static PyTypeObject Decomptype = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
38771
diff
changeset
|
968 PyVarObject_HEAD_INIT(0, 0) |
|
21313
91dd223829c6
Patch supplied by Burton Radons for his own SF bug #487390: Modifying
Guido van Rossum <guido@python.org>
parents:
20644
diff
changeset
|
969 "zlib.Decompress", |
| 20469 | 970 sizeof(compobject), |
| 971 0, | |
| 972 (destructor)Decomp_dealloc, /*tp_dealloc*/ | |
| 973 0, /*tp_print*/ | |
| 974 (getattrfunc)Decomp_getattr, /*tp_getattr*/ | |
| 975 0, /*tp_setattr*/ | |
| 976 0, /*tp_compare*/ | |
| 977 0, /*tp_repr*/ | |
| 978 0, /*tp_as_number*/ | |
| 979 0, /*tp_as_sequence*/ | |
| 980 0, /*tp_as_mapping*/ | |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
981 }; |
|
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
982 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
983 PyDoc_STRVAR(zlib_module_documentation, |
|
20485
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
984 "The functions in this module allow compression and decompression using the\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
985 "zlib library, which is based on GNU zip.\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
986 "\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
987 "adler32(string[, start]) -- Compute an Adler-32 checksum.\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
988 "compress(string[, level]) -- Compress string, with compression level in 1-9.\n" |
| 5722 | 989 "compressobj([level]) -- Return a compressor object.\n" |
|
20485
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
990 "crc32(string[, start]) -- Compute a CRC-32 checksum.\n" |
|
11607
69216c11a1bd
Fix typo in docstring: wbites -> wbits
Andrew M. Kuchling <amk@amk.ca>
parents:
10571
diff
changeset
|
991 "decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n" |
|
20485
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
992 "decompressobj([wbits]) -- Return a decompressor object.\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
993 "\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
994 "'wbits' is window buffer size.\n" |
|
4af8d24fa691
Simplify and regularize docstrings. Also reformat so that each docstring
Tim Peters <tim.peters@gmail.com>
parents:
20484
diff
changeset
|
995 "Compressor objects support compress() and flush() methods; decompressor\n" |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23295
diff
changeset
|
996 "objects support decompress() and flush()."); |
| 5722 | 997 |
|
24363
979ff5d0ae07
Replace DL_IMPORT with PyMODINIT_FUNC and remove "/export:init..." link
Mark Hammond <mhammond@skippinet.com.au>
parents:
24283
diff
changeset
|
998 PyMODINIT_FUNC |
|
13651
8a063423e0b7
Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents:
13496
diff
changeset
|
999 PyInit_zlib(void) |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1000 { |
|
22729
cdff3c7c1a76
Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents:
22217
diff
changeset
|
1001 PyObject *m, *ver; |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43937
diff
changeset
|
1002 Py_TYPE(&Comptype) = &PyType_Type; |
|
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43937
diff
changeset
|
1003 Py_TYPE(&Decomptype) = &PyType_Type; |
| 20469 | 1004 m = Py_InitModule4("zlib", zlib_methods, |
| 1005 zlib_module_documentation, | |
| 1006 (PyObject*)NULL,PYTHON_API_VERSION); | |
|
36324
1af7f719ed28
Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35914
diff
changeset
|
1007 if (m == NULL) |
|
1af7f719ed28
Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35914
diff
changeset
|
1008 return; |
|
22729
cdff3c7c1a76
Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents:
22217
diff
changeset
|
1009 |
| 20469 | 1010 ZlibError = PyErr_NewException("zlib.error", NULL, NULL); |
|
22729
cdff3c7c1a76
Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents:
22217
diff
changeset
|
1011 if (ZlibError != NULL) { |
|
cdff3c7c1a76
Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents:
22217
diff
changeset
|
1012 Py_INCREF(ZlibError); |
|
cdff3c7c1a76
Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents:
22217
diff
changeset
|
1013 PyModule_AddObject(m, "error", ZlibError); |
|
cdff3c7c1a76
Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents:
22217
diff
changeset
|
1014 } |
| 20469 | 1015 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS); |
| 1016 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED); | |
| 1017 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL); | |
| 1018 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED); | |
| 1019 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION); | |
| 1020 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION); | |
| 1021 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED); | |
| 1022 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY); | |
| 1023 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY); | |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
1024 |
| 20469 | 1025 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH); |
| 1026 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH); | |
| 1027 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH); | |
| 1028 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH); | |
|
20484
1a9494f9edb2
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
20483
diff
changeset
|
1029 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1030 ver = PyString_FromString(ZLIB_VERSION); |
|
22729
cdff3c7c1a76
Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents:
22217
diff
changeset
|
1031 if (ver != NULL) |
|
cdff3c7c1a76
Use the PyModule_Add*() APIs instead of manipulating the module dict
Fred Drake <fdrake@acm.org>
parents:
22217
diff
changeset
|
1032 PyModule_AddObject(m, "ZLIB_VERSION", ver); |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
1033 |
|
27653
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
1034 PyModule_AddStringConstant(m, "__version__", "1.0"); |
|
106a44a4b975
- Thanks to Scott David Daniels, a subtle bug in how the zlib
Guido van Rossum <guido@python.org>
parents:
24363
diff
changeset
|
1035 |
|
19798
091c01d07d98
Patch #450702: allow threads when calling into zlib, protect usage of
Martin v. Löwis <martin@v.loewis.de>
parents:
16735
diff
changeset
|
1036 #ifdef WITH_THREAD |
| 20469 | 1037 zlib_lock = PyThread_allocate_lock(); |
|
22217
da518fc78066
Changed C++ comment into standard comment.
Sjoerd Mullender <sjoerd@acm.org>
parents:
21313
diff
changeset
|
1038 #endif /* WITH_THREAD */ |
|
5352
d5757aad1a4f
Added Andrew Kuchling's zlib module.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1039 } |
