From 7cc6ab9062e9b2fde4dde0c3eba60ff0b3134fc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Sat, 24 Sep 2022 13:08:16 +0700 Subject: [PATCH] python3-protobuf: use upstream patch (fix memory leaks) --- .../patches/python-3.11.patch | 134 ++++++++++++++---- 1 file changed, 110 insertions(+), 24 deletions(-) diff --git a/srcpkgs/python3-protobuf/patches/python-3.11.patch b/srcpkgs/python3-protobuf/patches/python-3.11.patch index fdc569044b6..831e41ef900 100644 --- a/srcpkgs/python3-protobuf/patches/python-3.11.patch +++ b/srcpkgs/python3-protobuf/patches/python-3.11.patch @@ -1,46 +1,132 @@ ---- a/google/protobuf/pyext/descriptor.cc -+++ b/google/protobuf/pyext/descriptor.cc -@@ -91,6 +91,12 @@ PyObject* PyString_FromCppString(const s - // - // TODO(amauryfa): Change the proto2 compiler to remove the assignments, and - // remove this hack. -+#if PY_VERSION_HEX < 0x03090000 -+#define PyFrame_GetCode(x) (x)->f_code -+#define PyFrame_GetGlobals(x) (x)->f_globals -+#define PyFrame_GetLocals(x) (x)->f_locals -+#define PyFrame_GetBack(x) (x)->f_back +From da973aff2adab60a9e516d3202c111dbdde1a50f Mon Sep 17 00:00:00 2001 +From: Alexander Shadchin +Date: Sun, 14 Aug 2022 21:13:49 +0300 +Subject: [PATCH] Fix build with Python 3.11 + +The PyFrameObject structure members have been removed from the public C API. +--- + python/google/protobuf/pyext/descriptor.cc | 75 ++++++++++++++++++---- + 1 file changed, 62 insertions(+), 13 deletions(-) + +diff --git a/python/google/protobuf/pyext/descriptor.cc b/python/google/protobuf/pyext/descriptor.cc +index fc83acf01a..fc97b0fa6c 100644 +--- a/python/google/protobuf/pyext/descriptor.cc ++++ b/python/google/protobuf/pyext/descriptor.cc +@@ -58,6 +58,37 @@ + : 0) \ + : PyBytes_AsStringAndSize(ob, (charpp), (sizep))) + ++#if PY_VERSION_HEX < 0x030900B1 && !defined(PYPY_VERSION) ++static PyCodeObject* PyFrame_GetCode(PyFrameObject *frame) ++{ ++ Py_INCREF(frame->f_code); ++ return frame->f_code; ++} ++ ++static PyFrameObject* PyFrame_GetBack(PyFrameObject *frame) ++{ ++ Py_XINCREF(frame->f_back); ++ return frame->f_back; ++} +#endif - bool _CalledFromGeneratedFile(int stacklevel) { - #ifndef PYPY_VERSION ++ ++#if PY_VERSION_HEX < 0x030B00A7 && !defined(PYPY_VERSION) ++static PyObject* PyFrame_GetLocals(PyFrameObject *frame) ++{ ++ if (PyFrame_FastToLocalsWithError(frame) < 0) { ++ return NULL; ++ } ++ Py_INCREF(frame->f_locals); ++ return frame->f_locals; ++} ++ ++static PyObject* PyFrame_GetGlobals(PyFrameObject *frame) ++{ ++ Py_INCREF(frame->f_globals); ++ return frame->f_globals; ++} ++#endif ++ + namespace google { + namespace protobuf { + namespace python { +@@ -96,48 +127,66 @@ bool _CalledFromGeneratedFile(int stacklevel) { // This check is not critical and is somewhat difficult to implement correctly -@@ -100,18 +106,18 @@ bool _CalledFromGeneratedFile(int stackl - return false; + // in PyPy. + PyFrameObject* frame = PyEval_GetFrame(); ++ PyCodeObject* frame_code = nullptr; ++ PyObject* frame_globals = nullptr; ++ PyObject* frame_locals = nullptr; ++ bool result = false; ++ + if (frame == nullptr) { +- return false; ++ goto exit; } ++ Py_INCREF(frame); while (stacklevel-- > 0) { - frame = frame->f_back; -+ frame = PyFrame_GetBack(frame); ++ PyFrameObject* next_frame = PyFrame_GetBack(frame); ++ Py_DECREF(frame); ++ frame = next_frame; if (frame == nullptr) { - return false; +- return false; ++ goto exit; } } - if (frame->f_code->co_filename == nullptr) { -+ if (PyFrame_GetCode(frame)->co_filename == nullptr) { - return false; +- return false; ++ frame_code = PyFrame_GetCode(frame); ++ if (frame_code->co_filename == nullptr) { ++ goto exit; } char* filename; Py_ssize_t filename_size; - if (PyString_AsStringAndSize(frame->f_code->co_filename, -+ if (PyString_AsStringAndSize(PyFrame_GetCode(frame)->co_filename, ++ if (PyString_AsStringAndSize(frame_code->co_filename, &filename, &filename_size) < 0) { // filename is not a string. PyErr_Clear(); -@@ -132,7 +138,7 @@ bool _CalledFromGeneratedFile(int stackl - return false; +- return false; ++ goto exit; + } + if ((filename_size < 3) || + (strcmp(&filename[filename_size - 3], ".py") != 0)) { + // Cython's stack does not have .py file name and is not at global module + // scope. +- return true; ++ result = true; ++ goto exit; + } + if (filename_size < 7) { + // filename is too short. +- return false; ++ goto exit; + } + if (strcmp(&filename[filename_size - 7], "_pb2.py") != 0) { + // Filename is not ending with _pb2. +- return false; ++ goto exit; } - if (frame->f_globals != frame->f_locals) { -+ if (PyFrame_GetGlobals(frame) != PyFrame_GetLocals(frame)) { ++ frame_globals = PyFrame_GetGlobals(frame); ++ frame_locals = PyFrame_GetLocals(frame); ++ if (frame_globals != frame_locals) { // Not at global module scope - return false; +- return false; ++ goto exit; } + #endif +- return true; ++ result = true; ++exit: ++ Py_XDECREF(frame_globals); ++ Py_XDECREF(frame_locals); ++ Py_XDECREF(frame_code); ++ Py_XDECREF(frame); ++ return result; + } + + // If the calling code is not a _pb2.py file, raise AttributeError.