]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[Bug #1083110] calling .flush() on decompress objects causes a segfault due to an...
authorAndrew M. Kuchling <amk@amk.ca>
Tue, 28 Dec 2004 20:12:31 +0000 (20:12 +0000)
committerAndrew M. Kuchling <amk@amk.ca>
Tue, 28 Dec 2004 20:12:31 +0000 (20:12 +0000)
Lib/test/test_zlib.py
Misc/NEWS
Modules/zlibmodule.c

index 8683879f192cedcc605c0a500f66f60c312b91be..b4bf77ea011615373a36ea128ae563a069843e3f 100644 (file)
@@ -290,6 +290,16 @@ class CompressObjectTestCase(unittest.TestCase):
             # if decompressed data is different from the input data, choke.
             self.assertEqual(expanded, data, "17K random source doesn't match")
 
+    def test_empty_flush(self):
+        # Test that calling .flush() on unused objects works.
+        # (Bug #1083110 -- calling .flush() on decompress objects
+        # caused a core dump.)
+
+        co = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
+        self.failUnless(co.flush())  # Returns a zlib header
+        dco = zlib.decompressobj()
+        self.assertEqual(dco.flush(), "") # Returns nothing
+        
 
 def genblock(seed, length, step=1024, generator=random):
     """length-byte stream of random data from a seed (in step-byte blocks)."""
index 0482f1fb61b45e3202e6b7150a929c3444f3e828..dca67e33c89fbe25c8ff81c2bda56dd0b708b3f6 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -42,6 +42,9 @@ Library
   once when a size argument is given. This prevents a buffer overflow in the
   tokenizer with very long source lines.
 
+- Bug #1083110: ``zlib.decompress.flush()`` would segfault if called immediately
+  after creating the object, without any intervening ``.decompress()`` calls.
+
 
 Build
 -----
index 7fedae7887c83ba561c37cd9682f7b9de22992ed..c3238a0685017d2e04326c9f3d8ae4f79f071d80 100644 (file)
@@ -301,6 +301,8 @@ PyZlib_compressobj(PyObject *selfptr, PyObject *args)
        return(NULL);
     self->zst.zalloc = (alloc_func)NULL;
     self->zst.zfree = (free_func)Z_NULL;
+    self->zst.next_in = NULL;
+    self->zst.avail_in = 0;
     err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
     switch(err) {
     case (Z_OK):
@@ -335,6 +337,8 @@ PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
        return(NULL);
     self->zst.zalloc = (alloc_func)NULL;
     self->zst.zfree = (free_func)Z_NULL;
+    self->zst.next_in = NULL;
+    self->zst.avail_in = 0;
     err = inflateInit2(&self->zst, wbits);
     switch(err) {
     case (Z_OK):
@@ -516,7 +520,7 @@ PyZlib_objdecompress(compobject *self, PyObject *args)
        Py_END_ALLOW_THREADS
     }
 
-    /* Not all of the compressed data could be accomodated in the output buffer
+    /* Not all of the compressed data could be accommodated in the output buffer
        of specified size. Return the unconsumed tail in an attribute.*/
     if(max_length) {
        Py_DECREF(self->unconsumed_tail);