Skip to content

Commit 4f5160e

Browse files
Use PyObject_GetBuffer() in _imp.get_frozen_object().
1 parent 322cfd1 commit 4f5160e

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

Python/import.c

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2118,14 +2118,13 @@ _imp_get_frozen_object_impl(PyObject *module, PyObject *name,
21182118
/*[clinic end generated code: output=54368a673a35e745 input=034bdb88f6460b7b]*/
21192119
{
21202120
struct frozen_info info = {};
2121-
if (PyBytes_Check(dataobj)) {
2122-
info.data = PyBytes_AS_STRING(dataobj);
2123-
info.size = PyBytes_Size(dataobj);
2124-
}
2125-
else if (PyMemoryView_Check(dataobj)) {
2126-
Py_buffer *buf = PyMemoryView_GET_BUFFER(dataobj);
2127-
info.data = (const char *)buf->buf;
2128-
info.size = buf->len;
2121+
Py_buffer buf = {};
2122+
if (PyObject_CheckBuffer(dataobj)) {
2123+
if (PyObject_GetBuffer(dataobj, &buf, PyBUF_READ) != 0) {
2124+
return NULL;
2125+
}
2126+
info.data = (const char *)buf.buf;
2127+
info.size = buf.len;
21292128
}
21302129
else if (dataobj != Py_None) {
21312130
_PyArg_BadArgument("get_frozen_object", "argument 2", "bytes", dataobj);
@@ -2147,7 +2146,11 @@ _imp_get_frozen_object_impl(PyObject *module, PyObject *name,
21472146
return NULL;
21482147
}
21492148

2150-
return unmarshal_frozen_code(&info);
2149+
PyObject *codeobj = unmarshal_frozen_code(&info);
2150+
if (dataobj != Py_None) {
2151+
PyBuffer_Release(&buf);
2152+
}
2153+
return codeobj;
21512154
}
21522155

21532156
/*[clinic input]

0 commit comments

Comments
 (0)