}
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) {
}
}
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);
}
}
int level;
int optname;
int res;
- PyObject *buf;
socklen_t buflen = 0;
int flag = 0;
socklen_t flagsize;
"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,