[Python-3000-checkins] r64284 - in python/branches/py3k: Lib/test/test_exceptions.py Python/ceval.c
benjamin.peterson
python-3000-checkins at python.org
Sun Jun 15 02:05:44 CEST 2008
Author: benjamin.peterson
Date: Sun Jun 15 02:05:44 2008
New Revision: 64284
Log:
#3114 fix a bus error when deallocated exceptions were used
Modified:
python/branches/py3k/Lib/test/test_exceptions.py
python/branches/py3k/Python/ceval.c
Modified: python/branches/py3k/Lib/test/test_exceptions.py
==============================================================================
--- python/branches/py3k/Lib/test/test_exceptions.py (original)
+++ python/branches/py3k/Lib/test/test_exceptions.py Sun Jun 15 02:05:44 2008
@@ -5,6 +5,8 @@
import unittest
import pickle
import weakref
+import gc
+import traceback
from test.support import TESTFN, unlink, run_unittest
@@ -551,6 +553,23 @@
del g
self.assertEquals(sys.exc_info()[0], TypeError)
+ def test_crash_3114(self):
+ # Bug #3114: in its destructor, MyObject retrieves a pointer to a
+ # deallocated exception instance or traceback.
+ class MyObject:
+ def __del__(self):
+ nonlocal e
+ e = sys.exc_info()
+ e = ()
+ try:
+ raise Exception(MyObject())
+ except:
+ pass
+ gc.collect()
+ [0]*10000
+ # Do something with the exception and its traceback
+ traceback.format_exception(*e)
+
def test_main():
run_unittest(ExceptionTests)
Modified: python/branches/py3k/Python/ceval.c
==============================================================================
--- python/branches/py3k/Python/ceval.c (original)
+++ python/branches/py3k/Python/ceval.c Sun Jun 15 02:05:44 2008
@@ -704,11 +704,11 @@
PyObject *v = POP(); \
Py_XDECREF(v); \
} \
- Py_XDECREF(tstate->exc_type); \
+ Py_CLEAR(tstate->exc_type); \
+ Py_CLEAR(tstate->exc_value); \
+ Py_CLEAR(tstate->exc_traceback); \
tstate->exc_type = POP(); \
- Py_XDECREF(tstate->exc_value); \
tstate->exc_value = POP(); \
- Py_XDECREF(tstate->exc_traceback); \
tstate->exc_traceback = POP();
#define SAVE_EXC_STATE() \
@@ -716,9 +716,9 @@
Py_XINCREF(tstate->exc_type); \
Py_XINCREF(tstate->exc_value); \
Py_XINCREF(tstate->exc_traceback); \
- Py_XDECREF(f->f_exc_type); \
- Py_XDECREF(f->f_exc_value); \
- Py_XDECREF(f->f_exc_traceback); \
+ Py_CLEAR(f->f_exc_type); \
+ Py_CLEAR(f->f_exc_value); \
+ Py_CLEAR(f->f_exc_traceback); \
f->f_exc_type = tstate->exc_type; \
f->f_exc_value = tstate->exc_value; \
f->f_exc_traceback = tstate->exc_traceback; \
More information about the Python-3000-checkins
mailing list