diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2009-10-11 21:03:26 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2009-10-11 21:03:26 (GMT) |
commit | beaf6a02f45fe667ddcb1fbdd24f1ea7189b2105 (patch) | |
tree | 9a6492bd6a835552d3725436b1e0ce02cffa4b2c | |
parent | a4314c2b218fb0509a24c873a22137ff229a01fd (diff) | |
download | cpython-beaf6a02f45fe667ddcb1fbdd24f1ea7189b2105.zip cpython-beaf6a02f45fe667ddcb1fbdd24f1ea7189b2105.tar.gz cpython-beaf6a02f45fe667ddcb1fbdd24f1ea7189b2105.tar.bz2 |
Issue #7084: Fix a (very unlikely) crash when printing a list from one
thread, and mutating it from another one. Patch by Scott Dial.
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Objects/listobject.c | 7 |
3 files changed, 10 insertions, 1 deletions
@@ -175,6 +175,7 @@ Arnaud Delobelle Erik Demaine Roger Dev Raghuram Devarakonda +Scott Dial Toby Dickenson Mark Dickinson Jack Diederich @@ -12,6 +12,9 @@ What's New in Python 2.7 alpha 1 Core and Builtins ----------------- +- Issue #7084: Fix a (very unlikely) crash when printing a list from one + thread, and mutating it from another one. Patch by Scott Dial. + - Issue #1571184: The Unicode database contains properties for more characters. The tables for code points representing numeric values, white spaces or line breaks are now generated from the official Unicode Character Database files, diff --git a/Objects/listobject.c b/Objects/listobject.c index 98d7e47..c5b1475 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -319,6 +319,7 @@ list_print(PyListObject *op, FILE *fp, int flags) { int rc; Py_ssize_t i; + PyObject *item; rc = Py_ReprEnter((PyObject*)op); if (rc != 0) { @@ -333,15 +334,19 @@ list_print(PyListObject *op, FILE *fp, int flags) fprintf(fp, "["); Py_END_ALLOW_THREADS for (i = 0; i < Py_SIZE(op); i++) { + item = op->ob_item[i]; + Py_INCREF(item); if (i > 0) { Py_BEGIN_ALLOW_THREADS fprintf(fp, ", "); Py_END_ALLOW_THREADS } - if (PyObject_Print(op->ob_item[i], fp, 0) != 0) { + if (PyObject_Print(item, fp, 0) != 0) { + Py_DECREF(item); Py_ReprLeave((PyObject *)op); return -1; } + Py_DECREF(item); } Py_BEGIN_ALLOW_THREADS fprintf(fp, "]"); |