Skip to content

Commit d641c41

Browse files
authored
gh-129813, PEP 782: Use PyBytesWriter in socket recvmsg() (#139131)
Replace PyBytes_FromStringAndSize(NULL, size) and _PyBytes_Resize() with the new public PyBytesWriter API.
1 parent e163fbd commit d641c41

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

Modules/socketmodule.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4425,43 +4425,43 @@ sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
44254425
static PyObject *
44264426
makeval_recvmsg(ssize_t received, void *data)
44274427
{
4428-
PyObject **buf = data;
4429-
4430-
if (received < PyBytes_GET_SIZE(*buf))
4431-
_PyBytes_Resize(buf, received);
4432-
return Py_XNewRef(*buf);
4428+
PyBytesWriter **writer = data;
4429+
PyObject *buf = PyBytesWriter_FinishWithSize(*writer, received);
4430+
*writer = NULL;
4431+
return buf;
44334432
}
44344433

44354434
/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
44364435

44374436
static PyObject *
44384437
sock_recvmsg(PyObject *self, PyObject *args)
44394438
{
4440-
PySocketSockObject *s = _PySocketSockObject_CAST(self);
4441-
44424439
Py_ssize_t bufsize, ancbufsize = 0;
44434440
int flags = 0;
4444-
struct iovec iov;
4445-
PyObject *buf = NULL, *retval = NULL;
4446-
44474441
if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
44484442
return NULL;
44494443

44504444
if (bufsize < 0) {
44514445
PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
44524446
return NULL;
44534447
}
4454-
if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
4448+
4449+
PyBytesWriter *writer = PyBytesWriter_Create(bufsize);
4450+
if (writer == NULL) {
44554451
return NULL;
4456-
iov.iov_base = PyBytes_AS_STRING(buf);
4452+
}
4453+
struct iovec iov;
4454+
iov.iov_base = PyBytesWriter_GetData(writer);
44574455
iov.iov_len = bufsize;
44584456

44594457
/* Note that we're passing a pointer to *our pointer* to the bytes
4460-
object here (&buf); makeval_recvmsg() may incref the object, or
4461-
deallocate it and set our pointer to NULL. */
4458+
writer (&writer); makeval_recvmsg() finish it and set our pointer to
4459+
NULL. */
4460+
PyObject *retval;
4461+
PySocketSockObject *s = _PySocketSockObject_CAST(self);
44624462
retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
4463-
&makeval_recvmsg, &buf);
4464-
Py_XDECREF(buf);
4463+
&makeval_recvmsg, &writer);
4464+
PyBytesWriter_Discard(writer);
44654465
return retval;
44664466
}
44674467

0 commit comments

Comments
 (0)