diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -2781,7 +2781,6 @@ void PyBytes_Concat(PyObject **pv, PyObject *w) { - PyObject *v; assert(pv != NULL); if (*pv == NULL) return; @@ -2789,9 +2788,32 @@ Py_CLEAR(*pv); return; } - v = bytes_concat(*pv, w); - Py_DECREF(*pv); - *pv = v; + if (!PyBytes_Check(*pv) || !PyBytes_Check(w)) { + PyErr_BadInternalCall(); + Py_CLEAR(*pv); + return; + } + + if (Py_REFCNT(*pv) == 1) { + /* Only one reference, so we can resize in place */ + PyBytesObject *sv; + size_t oldsize, w_size; + + oldsize = PyBytes_GET_SIZE(*pv); + w_size = PyBytes_GET_SIZE(w); + if (_PyBytes_Resize(pv, oldsize + w_size) != 0) + return; + + sv = (PyBytesObject*) *pv; + memcpy(sv->ob_sval + oldsize, PyBytes_AS_STRING(w), + w_size); + } + else { + PyObject *v; + v = bytes_concat(*pv, w); + Py_DECREF(*pv); + *pv = v; + } } void