summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2002-03-28 20:18:48 +0000
committerGuido van Rossum <guido@python.org>2002-03-28 20:18:48 +0000
commitfe34d0facd54a6f471d73f3cba114dedc4f04969 (patch)
tree47d00d20462fc98dba4c30760e9c0da49172315e /Python
parent8812776e9010ed2947fafdd0fd085236a9f588fc (diff)
downloadcpython-git-fe34d0facd54a6f471d73f3cba114dedc4f04969.tar.gz
Backport to 2.2.1.
Fix an issue that was reported in but unrelated to the main problem of SF bug 535905 (Evil Trashcan and GC interaction). The SETLOCAL() macro should not DECREF the local variable in-place and then store the new value; it should copy the old value to a temporary value, then store the new value, and then DECREF the temporary value. This is because it is possible that during the DECREF the frame is accessed by other code (e.g. a __del__ method or gc.collect()) and the variable would be pointing to already-freed memory. BUGFIX CANDIDATE!
Diffstat (limited to 'Python')
-rw-r--r--Python/ceval.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index e7ca82bc1a..0fa5887781 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -554,8 +554,16 @@ eval_frame(PyFrameObject *f)
/* Local variable macros */
#define GETLOCAL(i) (fastlocals[i])
-#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
- GETLOCAL(i) = value; } while (0)
+
+/* The SETLOCAL() macro must not DECREF the local variable in-place and
+ then store the new value; it must copy the old value to a temporary
+ value, then store the new value, and then DECREF the temporary value.
+ This is because it is possible that during the DECREF the frame is
+ accessed by other code (e.g. a __del__ method or gc.collect()) and the
+ variable would be pointing to already-freed memory. */
+#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
+ GETLOCAL(i) = value; \
+ Py_XDECREF(tmp); } while (0)
/* Start of code */