@@ -709,7 +709,8 @@ bytearray_ass_subscript_lock_held(PyObject *op, PyObject *index, PyObject *value
709
709
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (op );
710
710
PyByteArrayObject * self = _PyByteArray_CAST (op );
711
711
Py_ssize_t start , stop , step , slicelen ;
712
- char * buf = PyByteArray_AS_STRING (self );
712
+ // GH-91153: we cannot store a reference to the internal buffer here, as _getbytevalue might call into python code
713
+ // that could then invalidate it.
713
714
714
715
if (_PyIndex_Check (index )) {
715
716
Py_ssize_t i = PyNumber_AsSsize_t (index , PyExc_IndexError );
@@ -744,7 +745,7 @@ bytearray_ass_subscript_lock_held(PyObject *op, PyObject *index, PyObject *value
744
745
}
745
746
else {
746
747
assert (0 <= ival && ival < 256 );
747
- buf [i ] = (char )ival ;
748
+ PyByteArray_AS_STRING ( self ) [i ] = (char )ival ;
748
749
return 0 ;
749
750
}
750
751
}
@@ -805,6 +806,7 @@ bytearray_ass_subscript_lock_held(PyObject *op, PyObject *index, PyObject *value
805
806
/* Delete slice */
806
807
size_t cur ;
807
808
Py_ssize_t i ;
809
+ char * buf = PyByteArray_AS_STRING (self );
808
810
809
811
if (!_canresize (self ))
810
812
return -1 ;
@@ -845,6 +847,7 @@ bytearray_ass_subscript_lock_held(PyObject *op, PyObject *index, PyObject *value
845
847
/* Assign slice */
846
848
Py_ssize_t i ;
847
849
size_t cur ;
850
+ char * buf = PyByteArray_AS_STRING (self );
848
851
849
852
if (needed != slicelen ) {
850
853
PyErr_Format (PyExc_ValueError ,
0 commit comments