Initial patch by Vajrasky Kok.
self.assertRaises(ValueError, f.readline)
self.assertRaises(ValueError, f.readlines)
+ def testInitNonExistentFile(self):
+ # Issue #19878: Should not segfault when __init__ with non-existent
+ # file for the second time.
+ self.createTempFile()
+ # Test close():
+ with BZ2File(self.filename, "wb") as f:
+ self.assertRaises(IOError, f.__init__, "non-existent-file")
+ # Test object deallocation without call to close():
+ f = bz2.BZ2File(self.filename)
+ self.assertRaises(IOError, f.__init__, "non-existent-file")
+ del f
+
class BZ2CompressorTest(BaseTest):
def testCompress(self):
# "Test BZ2Compressor.compress()/flush()"
Library
-------
+- Issue #19878: Fix segfault in bz2 module after calling __init__ twice with
+ non-existent filename. Initial patch by Vajrasky Kok.
+
- Issue #16373: Prevent infinite recursion for ABC Set class comparisons.
- Issue #19138: doctest's IGNORE_EXCEPTION_DETAIL now allows a match when
0, NULL, NULL);
break;
}
- if (self->fp) {
- PyFile_DecUseCount((PyFileObject *)self->file);
- self->fp = NULL;
+ if (self->file) {
+ if (self->fp)
+ PyFile_DecUseCount((PyFileObject *)self->file);
+ ret = PyObject_CallMethod(self->file, "close", NULL);
+ } else {
+ Py_INCREF(Py_None);
+ ret = Py_None;
}
+ self->fp = NULL;
self->mode = MODE_CLOSED;
- ret = PyObject_CallMethod(self->file, "close", NULL);
if (bzerror != BZ_OK) {
Util_CatchBZ2Error(bzerror);
Py_XDECREF(ret);
0, NULL, NULL);
break;
}
- if (self->fp) {
+ if (self->fp != NULL && self->file != NULL)
PyFile_DecUseCount((PyFileObject *)self->file);
- self->fp = NULL;
- }
+ self->fp = NULL;
Util_DropReadAhead(self);
Py_XDECREF(self->file);
Py_TYPE(self)->tp_free((PyObject *)self);