@@ -3191,12 +3191,36 @@ bytes_iteritem(PyObject *obj, Py_ssize_t index)
31913191 return (_PyObjectIndexPair ) { .object = l , .index = index + 1 };
31923192}
31933193
3194+ #ifdef Py_DEBUG
3195+ static void
3196+ bytes_dealloc (PyObject * op )
3197+ {
3198+ // Make sure that the trailing null byte was not modified
3199+ PyBytesObject * self = _PyBytes_CAST (op );
3200+ char * data = PyBytes_AS_STRING (self );
3201+ Py_ssize_t size = PyBytes_GET_SIZE (self );
3202+ if (data [size ] != '\0' ) {
3203+ _Py_FatalErrorFormat (__func__ ,
3204+ "Buffer overflow detected in bytes object %p "
3205+ "at position %zd" ,
3206+ self , size );
3207+ }
3208+
3209+ Py_TYPE (self )-> tp_free ((PyObject * )self );
3210+ }
3211+ #endif
3212+
3213+
31943214PyTypeObject PyBytes_Type = {
31953215 PyVarObject_HEAD_INIT (& PyType_Type , 0 )
31963216 "bytes" ,
31973217 PyBytesObject_SIZE ,
31983218 sizeof (char ),
3219+ #ifdef Py_DEBUG
3220+ bytes_dealloc , /* tp_dealloc */
3221+ #else
31993222 0 , /* tp_dealloc */
3223+ #endif
32003224 0 , /* tp_vectorcall_offset */
32013225 0 , /* tp_getattr */
32023226 0 , /* tp_setattr */
@@ -3665,6 +3689,20 @@ byteswriter_write_canary_byte(PyBytesWriter *writer)
36653689 unsigned char * data = (unsigned char * )byteswriter_data (writer );
36663690 data [writer -> size ] = PyBytesWriter_CANARY_BYTE ;
36673691}
3692+
3693+
3694+ static void
3695+ byteswriter_reset_trailing_byte (PyBytesWriter * writer )
3696+ {
3697+ if (writer -> obj != NULL ) {
3698+ // PyBytesArray writes non-zero canary byte as the last byte.
3699+ // bytes/bytearray expects the last byte to be a null byte.
3700+ // Reset the last byte to null for bytes/bytearray.
3701+ Py_ssize_t allocated = byteswriter_allocated (writer );
3702+ char * data = byteswriter_data (writer );
3703+ data [allocated ] = '\0' ;
3704+ }
3705+ }
36683706#endif
36693707
36703708
@@ -3814,6 +3852,7 @@ PyBytesWriter_Discard(PyBytesWriter *writer)
38143852
38153853#ifdef Py_DEBUG
38163854 byteswriter_check_canary_byte (writer );
3855+ byteswriter_reset_trailing_byte (writer );
38173856#endif
38183857
38193858 Py_XDECREF (writer -> obj );
@@ -3838,16 +3877,8 @@ PyBytesWriter_FinishWithSize(PyBytesWriter *writer, Py_ssize_t size)
38383877 }
38393878
38403879#ifdef Py_DEBUG
3841- // Check for buffer overflow
38423880 byteswriter_check_canary_byte (writer );
3843-
3844- if (writer -> obj != NULL ) {
3845- // byteswriter_write_canary_byte() can override the trailing NUL byte.
3846- // So reset the trailing NUL byte to NUL.
3847- Py_ssize_t allocated = byteswriter_allocated (writer );
3848- char * data = byteswriter_data (writer );
3849- data [allocated ] = '\0' ;
3850- }
3881+ byteswriter_reset_trailing_byte (writer );
38513882#endif
38523883
38533884 PyObject * result ;
0 commit comments