mirror of
https://github.com/void-linux/void-packages.git
synced 2025-07-29 17:02:56 +02:00
python3-protobuf: use upstream patch (fix memory leaks)
This commit is contained in:
parent
d9a0015833
commit
7cc6ab9062
1 changed files with 110 additions and 24 deletions
|
@ -1,46 +1,132 @@
|
||||||
--- a/google/protobuf/pyext/descriptor.cc
|
From da973aff2adab60a9e516d3202c111dbdde1a50f Mon Sep 17 00:00:00 2001
|
||||||
+++ b/google/protobuf/pyext/descriptor.cc
|
From: Alexander Shadchin <alexandr.shadchin@gmail.com>
|
||||||
@@ -91,6 +91,12 @@ PyObject* PyString_FromCppString(const s
|
Date: Sun, 14 Aug 2022 21:13:49 +0300
|
||||||
//
|
Subject: [PATCH] Fix build with Python 3.11
|
||||||
// TODO(amauryfa): Change the proto2 compiler to remove the assignments, and
|
|
||||||
// remove this hack.
|
The PyFrameObject structure members have been removed from the public C API.
|
||||||
+#if PY_VERSION_HEX < 0x03090000
|
---
|
||||||
+#define PyFrame_GetCode(x) (x)->f_code
|
python/google/protobuf/pyext/descriptor.cc | 75 ++++++++++++++++++----
|
||||||
+#define PyFrame_GetGlobals(x) (x)->f_globals
|
1 file changed, 62 insertions(+), 13 deletions(-)
|
||||||
+#define PyFrame_GetLocals(x) (x)->f_locals
|
|
||||||
+#define PyFrame_GetBack(x) (x)->f_back
|
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
|
+#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
|
// This check is not critical and is somewhat difficult to implement correctly
|
||||||
@@ -100,18 +106,18 @@ bool _CalledFromGeneratedFile(int stackl
|
// in PyPy.
|
||||||
return false;
|
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) {
|
while (stacklevel-- > 0) {
|
||||||
- frame = frame->f_back;
|
- frame = frame->f_back;
|
||||||
+ frame = PyFrame_GetBack(frame);
|
+ PyFrameObject* next_frame = PyFrame_GetBack(frame);
|
||||||
|
+ Py_DECREF(frame);
|
||||||
|
+ frame = next_frame;
|
||||||
if (frame == nullptr) {
|
if (frame == nullptr) {
|
||||||
return false;
|
- return false;
|
||||||
|
+ goto exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- if (frame->f_code->co_filename == nullptr) {
|
- 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;
|
char* filename;
|
||||||
Py_ssize_t filename_size;
|
Py_ssize_t filename_size;
|
||||||
- if (PyString_AsStringAndSize(frame->f_code->co_filename,
|
- 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, &filename_size) < 0) {
|
||||||
// filename is not a string.
|
// filename is not a string.
|
||||||
PyErr_Clear();
|
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 (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
|
// 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.
|
||||||
|
|
Loading…
Add table
Reference in a new issue