Skip to content

Commit 6c2f07d

Browse files
committed
Fix off-by-one error
1 parent a962017 commit 6c2f07d

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-4
lines changed

Lib/test/test_frame.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,11 +602,13 @@ def test_overwrite_locals(self):
602602
# from an ancestor in the call stack.
603603
def f():
604604
xs = [1, 2, 3]
605+
ys = [4, 5, 6]
605606
return g(xs)
606607

607608
def g(xs):
608609
f = sys._getframe()
609610
f.f_back.f_locals["xs"] = None
611+
f.f_back.f_locals["ys"] = None
610612
return xs[1]
611613

612614
self.assertEqual(f(), 2)

Objects/frameobject.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,12 +209,16 @@ framelocalsproxy_getitem(PyObject *self, PyObject *key)
209209
static int
210210
add_overwritten_fast_local(PyFrameObject *frame, PyObject *obj)
211211
{
212-
Py_ssize_t new_size = 1;
213-
if (frame->f_overwritten_fast_locals != NULL) {
214-
new_size = PyTuple_Size(frame->f_overwritten_fast_locals);
215-
if (new_size == -1) {
212+
Py_ssize_t new_size;
213+
if (frame->f_overwritten_fast_locals == NULL) {
214+
new_size = 1;
215+
}
216+
else {
217+
Py_ssize_t size = PyTuple_Size(frame->f_overwritten_fast_locals);
218+
if (size == -1) {
216219
return -1;
217220
}
221+
new_size = size + 1;
218222
}
219223
PyObject *new_tuple = PyTuple_New(new_size);
220224
if (new_tuple == NULL) {

0 commit comments

Comments
 (0)