Skip to content

Commit 98f1433

Browse files
committed
check type before lock in array_ass_subscr()
1 parent 5f352a3 commit 98f1433

File tree

1 file changed

+12
-11
lines changed

1 file changed

+12
-11
lines changed

Modules/arraymodule.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2642,15 +2642,15 @@ array_subscr(PyObject *op, PyObject *item)
26422642
static int
26432643
array_ass_subscr_lock_held(PyObject *op, PyObject* item, PyObject* value)
26442644
{
2645+
array_state* state = find_array_state_by_type(Py_TYPE(op));
26452646
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op);
2646-
#ifdef Py_DEBUG
2647-
if (value != NULL) {
2648-
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(value);
2649-
}
2650-
#endif
2647+
#ifdef Py_DEBUG
2648+
if (value != NULL && array_Check(value, state)) {
2649+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(value);
2650+
}
2651+
#endif
26512652
arrayobject *self = arrayobject_CAST(op);
26522653
Py_ssize_t start, stop, step, slicelength, needed;
2653-
array_state* state = find_array_state_by_type(Py_TYPE(self));
26542654
arrayobject* other;
26552655
int itemsize;
26562656

@@ -2808,15 +2808,16 @@ static int
28082808
array_ass_subscr(PyObject *op, PyObject* item, PyObject* value)
28092809
{
28102810
int ret;
2811-
if (value == NULL) {
2812-
Py_BEGIN_CRITICAL_SECTION(op);
2811+
array_state* state = find_array_state_by_type(Py_TYPE(op));
2812+
if (value != NULL && array_Check(value, state)) {
2813+
Py_BEGIN_CRITICAL_SECTION2(op, value);
28132814
ret = array_ass_subscr_lock_held(op, item, value);
2814-
Py_END_CRITICAL_SECTION();
2815+
Py_END_CRITICAL_SECTION2();
28152816
}
28162817
else {
2817-
Py_BEGIN_CRITICAL_SECTION2(op, value);
2818+
Py_BEGIN_CRITICAL_SECTION(op);
28182819
ret = array_ass_subscr_lock_held(op, item, value);
2819-
Py_END_CRITICAL_SECTION2();
2820+
Py_END_CRITICAL_SECTION();
28202821
}
28212822
return ret;
28222823
}

0 commit comments

Comments
 (0)