@@ -796,6 +796,8 @@ backslashreplace(PyBytesWriter *writer, char *str,
796796 }
797797 size += incr ;
798798 }
799+ /* subtract preallocated bytes */
800+ size -= (collend - collstart );
799801
800802 str = PyBytesWriter_GrowAndUpdatePointer (writer , size , str );
801803 if (str == NULL ) {
@@ -871,6 +873,8 @@ xmlcharrefreplace(PyBytesWriter *writer, char *str,
871873 }
872874 size += incr ;
873875 }
876+ /* subtract preallocated bytes */
877+ size -= (collend - collstart );
874878
875879 str = PyBytesWriter_GrowAndUpdatePointer (writer , size , str );
876880 if (str == NULL ) {
@@ -7262,8 +7266,6 @@ unicode_encode_ucs1(PyObject *unicode,
72627266 break ;
72637267
72647268 case _Py_ERROR_BACKSLASHREPLACE :
7265- /* subtract preallocated bytes */
7266- writer -> size -= (collend - collstart );
72677269 str = backslashreplace (writer , str ,
72687270 unicode , collstart , collend );
72697271 if (str == NULL )
@@ -7272,8 +7274,6 @@ unicode_encode_ucs1(PyObject *unicode,
72727274 break ;
72737275
72747276 case _Py_ERROR_XMLCHARREFREPLACE :
7275- /* subtract preallocated bytes */
7276- writer -> size -= (collend - collstart );
72777277 str = xmlcharrefreplace (writer , str ,
72787278 unicode , collstart , collend );
72797279 if (str == NULL )
@@ -7314,10 +7314,13 @@ unicode_encode_ucs1(PyObject *unicode,
73147314 }
73157315 }
73167316 else {
7317- /* subtract preallocated bytes */
7318- writer -> size -= newpos - collstart ;
73197317 /* Only overallocate the buffer if it's not the last write */
73207318 writer -> overallocate = (newpos < size );
7319+
7320+ /* subtract preallocated bytes */
7321+ if (PyBytesWriter_Grow (writer , - (newpos - collstart )) < 0 ) {
7322+ goto onError ;
7323+ }
73217324 }
73227325
73237326 const char * rep_str ;
0 commit comments