https://github.com/python/cpython/commit/bb743b684b423c4ec0165a33c13d41fc8009217b
commit: bb743b684b423c4ec0165a33c13d41fc8009217b
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2025-09-13T18:31:26+02:00
summary:
gh-129813, PEP 782: Use PyBytesWriter in socket and mmap (#138831)
Replace PyBytes_FromStringAndSize(NULL, size) and _PyBytes_Resize()
with the new public PyBytesWriter API.
files:
M Modules/mmapmodule.c
M Modules/socketmodule.c
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index 8c9d463ad903ec..8caadde8ae211b 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -448,7 +448,8 @@ _safe_PyBytes_ReverseFind(Py_ssize_t *out, mmap_object
*self,
}
PyObject *
-_safe_PyBytes_FromStringAndSize(char *start, size_t num_bytes) {
+_safe_PyBytes_FromStringAndSize(char *start, size_t num_bytes)
+{
if (num_bytes == 1) {
char dest;
if (safe_byte_copy(&dest, start) < 0) {
@@ -459,14 +460,15 @@ _safe_PyBytes_FromStringAndSize(char *start, size_t
num_bytes) {
}
}
else {
- PyObject *result = PyBytes_FromStringAndSize(NULL, num_bytes);
- if (result == NULL) {
+ PyBytesWriter *writer = PyBytesWriter_Create(num_bytes);
+ if (writer == NULL) {
return NULL;
}
- if (safe_memcpy(PyBytes_AS_STRING(result), start, num_bytes) < 0) {
- Py_CLEAR(result);
+ if (safe_memcpy(PyBytesWriter_GetData(writer), start, num_bytes) < 0) {
+ PyBytesWriter_Discard(writer);
+ return NULL;
}
- return result;
+ return PyBytesWriter_Finish(writer);
}
}
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index dc8e08ac3e522e..f76be53f6de4ef 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -3467,7 +3467,6 @@ sock_getsockopt(PyObject *self, PyObject *args)
int level;
int optname;
int res;
- PyObject *buf;
socklen_t buflen = 0;
int flag = 0;
socklen_t flagsize;
@@ -3512,17 +3511,17 @@ sock_getsockopt(PyObject *self, PyObject *args)
"getsockopt buflen out of range");
return NULL;
}
- buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
- if (buf == NULL)
+ PyBytesWriter *writer = PyBytesWriter_Create(buflen);
+ if (writer == NULL) {
return NULL;
+ }
res = getsockopt(get_sock_fd(s), level, optname,
- (void *)PyBytes_AS_STRING(buf), &buflen);
+ PyBytesWriter_GetData(writer), &buflen);
if (res < 0) {
- Py_DECREF(buf);
+ PyBytesWriter_Discard(writer);
return s->errorhandler();
}
- _PyBytes_Resize(&buf, buflen);
- return buf;
+ return PyBytesWriter_FinishWithSize(writer, buflen);
}
PyDoc_STRVAR(getsockopt_doc,
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]