@@ -3344,68 +3344,99 @@ PyBytes_ConcatAndDel(PyObject **pv, PyObject *w)
33443344 does *not* include that), and a trailing \0 byte is stored.
33453345*/
33463346
3347- int
3348- _PyBytes_Resize (PyObject * * pv , Py_ssize_t newsize )
3347+ static int
3348+ bytes_resize (PyObject * * pv , Py_ssize_t newsize , int clear_obj_on_error )
33493349{
3350- PyObject * v ;
3351- PyBytesObject * sv ;
3352- v = * pv ;
3350+ PyObject * v = * pv ;
3351+ PyObject * result ;
3352+
33533353 if (!PyBytes_Check (v ) || newsize < 0 ) {
3354- * pv = 0 ;
3355- Py_DECREF (v );
33563354 PyErr_BadInternalCall ();
3357- return -1 ;
3355+ goto error ;
33583356 }
3357+
33593358 Py_ssize_t oldsize = PyBytes_GET_SIZE (v );
33603359 if (oldsize == newsize ) {
33613360 /* return early if newsize equals to v->ob_size */
33623361 return 0 ;
33633362 }
3363+
33643364 if (oldsize == 0 ) {
3365- * pv = _PyBytes_FromSize (newsize , 0 );
3365+ result = _PyBytes_FromSize (newsize , 0 );
3366+ if (result == NULL ) {
3367+ goto error ;
3368+ }
3369+ * pv = result ;
33663370 Py_DECREF (v );
3367- return ( * pv == NULL ) ? -1 : 0 ;
3371+ return 0 ;
33683372 }
3373+
33693374 if (newsize == 0 ) {
3370- * pv = bytes_get_empty ();
3375+ * pv = bytes_get_empty (); // cannot fail
33713376 Py_DECREF (v );
33723377 return 0 ;
33733378 }
3379+
33743380 if (!_PyObject_IsUniquelyReferenced (v )) {
3375- if (oldsize < newsize ) {
3376- * pv = _PyBytes_FromSize (newsize , 0 );
3377- if (* pv ) {
3378- memcpy (PyBytes_AS_STRING (* pv ), PyBytes_AS_STRING (v ), oldsize );
3379- }
3380- }
3381- else {
3382- * pv = PyBytes_FromStringAndSize (PyBytes_AS_STRING (v ), newsize );
3381+ result = _PyBytes_FromSize (newsize , 0 );
3382+ if (!result ) {
3383+ goto error ;
33833384 }
3385+
3386+ memcpy (PyBytes_AS_STRING (result ), PyBytes_AS_STRING (v ), Py_MIN (oldsize , newsize ));
3387+ * pv = result ;
33843388 Py_DECREF (v );
3385- return ( * pv == NULL ) ? -1 : 0 ;
3389+ return 0 ;
33863390 }
3387- assert (v != bytes_get_empty ());
33883391
3392+ assert (v != bytes_get_empty ());
33893393#ifdef Py_TRACE_REFS
33903394 _Py_ForgetReference (v );
33913395#endif
33923396 _PyReftracerTrack (v , PyRefTracer_DESTROY );
3393- * pv = (PyObject * )
3394- PyObject_Realloc (v , PyBytesObject_SIZE + newsize );
3395- if (* pv == NULL ) {
3397+ result = (PyObject * )PyObject_Realloc (v , PyBytesObject_SIZE + newsize );
3398+ if (result == NULL ) {
3399+ if (clear_obj_on_error ) {
3400+ * pv = NULL ;
33963401#ifdef Py_REF_DEBUG
3397- _Py_DecRefTotal (_PyThreadState_GET ());
3402+ _Py_DecRefTotal (_PyThreadState_GET ());
33983403#endif
3399- PyObject_Free (v );
3404+ PyObject_Free (v );
3405+ }
34003406 PyErr_NoMemory ();
34013407 return -1 ;
34023408 }
3403- _Py_NewReferenceNoTotal (* pv );
3404- sv = (PyBytesObject * ) * pv ;
3409+
3410+ v = result ;
3411+ _Py_NewReferenceNoTotal (v );
3412+ PyBytesObject * sv = (PyBytesObject * )v ;
34053413 Py_SET_SIZE (sv , newsize );
34063414 sv -> ob_sval [newsize ] = '\0' ;
34073415 set_ob_shash (sv , -1 ); /* invalidate cached hash value */
3416+ * pv = v ;
34083417 return 0 ;
3418+
3419+ error :
3420+ if (clear_obj_on_error ) {
3421+ * pv = NULL ;
3422+ Py_DECREF (v );
3423+ }
3424+ return -1 ;
3425+ }
3426+
3427+
3428+ int
3429+ _PyBytes_Resize (PyObject * * pv , Py_ssize_t newsize )
3430+ {
3431+ return bytes_resize (pv , newsize , 1 );
3432+ }
3433+
3434+
3435+ // Similar to _PyBytes_Resize(), but leaves the object unchanged on error.
3436+ int
3437+ _PyBytes_ResizeKeepOnError (PyObject * * pv , Py_ssize_t newsize )
3438+ {
3439+ return bytes_resize (pv , newsize , 0 );
34093440}
34103441
34113442
@@ -3646,7 +3677,8 @@ byteswriter_resize(PyBytesWriter *writer, Py_ssize_t size, int resize)
36463677 }
36473678 }
36483679 else {
3649- if (_PyBytes_Resize (& writer -> obj , size )) {
3680+ if (_PyBytes_ResizeKeepOnError (& writer -> obj , size )) {
3681+ assert (writer -> obj != NULL );
36503682 return -1 ;
36513683 }
36523684 }
0 commit comments