summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--www-apache/mod_wsgi/files/mod_wsgi-4.7.1-py310.patch126
-rw-r--r--www-apache/mod_wsgi/mod_wsgi-4.7.1-r1.ebuild6
2 files changed, 131 insertions, 1 deletions
diff --git a/www-apache/mod_wsgi/files/mod_wsgi-4.7.1-py310.patch b/www-apache/mod_wsgi/files/mod_wsgi-4.7.1-py310.patch
new file mode 100644
index 000000000000..274046d99ca0
--- /dev/null
+++ b/www-apache/mod_wsgi/files/mod_wsgi-4.7.1-py310.patch
@@ -0,0 +1,126 @@
+From b439f1c411a9479ccc03c16465cdff50fede79d3 Mon Sep 17 00:00:00 2001
+From: Petr Viktorin <encukou@gmail.com>
+Date: Thu, 10 Jun 2021 15:45:03 +0200
+Subject: [PATCH] Use Py_CompileString rather than
+ PyParser_SimpleParseFile/PyNode_Compile
+From: https://github.com/GrahamDumpleton/mod_wsgi/commit/b439f1c411a9479ccc03c16465cdff50fede79d3
+
+---
+ src/server/mod_wsgi.c | 68 +++++++++++++++++++++++++++++++---------
+ src/server/wsgi_python.h | 1 -
+ 2 files changed, 53 insertions(+), 16 deletions(-)
+
+diff --git a/src/server/mod_wsgi.c b/src/server/mod_wsgi.c
+index b657a748..4f1d8765 100644
+--- a/src/server/mod_wsgi.c
++++ b/src/server/mod_wsgi.c
+@@ -3645,7 +3645,10 @@ static PyObject *wsgi_load_source(apr_pool_t *pool, request_rec *r,
+ FILE *fp = NULL;
+ PyObject *m = NULL;
+ PyObject *co = NULL;
+- struct _node *n = NULL;
++ char *source;
++ size_t pos = 0;
++ size_t allocated = 1024;
++ size_t nread;
+
+ #if defined(WIN32) && defined(APR_HAS_UNICODE_FS)
+ apr_wchar_t wfilename[APR_PATH_MAX];
+@@ -3730,36 +3733,71 @@ static PyObject *wsgi_load_source(apr_pool_t *pool, request_rec *r,
+ return NULL;
+ }
+
+- n = PyParser_SimpleParseFile(fp, filename, Py_file_input);
+-
++ source = malloc(allocated);
++ if (source != NULL) {
++ do {
++ nread = fread(source + pos, 1, allocated - pos, fp);
++ pos += nread;
++ if (nread == 0) {
++ if (ferror(fp)) {
++ free(source);
++ source = NULL;
++ }
++ break;
++ }
++ if (pos == allocated) {
++ allocated *= 2;
++ char *reallocated_source = realloc(source, allocated);
++ if (reallocated_source == NULL) {
++ free(source);
++ source = NULL;
++ break;
++ }
++ source = reallocated_source;
++ }
++ } while (!feof(fp));
++ }
+ fclose(fp);
+-
+- if (!n) {
++ if (source == NULL) {
+ Py_BEGIN_ALLOW_THREADS
+ if (r) {
+- ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
++ ap_log_rerror(APLOG_MARK, APLOG_ERR, errno, r,
+ "mod_wsgi (pid=%d, process='%s', application='%s'): "
+- "Failed to parse Python script file '%s'.", getpid(),
++ "Could not read source file '%s'.", getpid(),
+ process_group, application_group, filename);
+ }
+ else {
+- ap_log_error(APLOG_MARK, APLOG_ERR, 0, wsgi_server,
++ ap_log_error(APLOG_MARK, APLOG_ERR, errno, wsgi_server,
+ "mod_wsgi (pid=%d, process='%s', application='%s'): "
+- "Failed to parse Python script file '%s'.", getpid(),
++ "Could not read source file '%s'.", getpid(),
+ process_group, application_group, filename);
+ }
+ Py_END_ALLOW_THREADS
++ return NULL;
++ }
+
+- wsgi_log_python_error(r, NULL, filename, 0);
++ co = Py_CompileString(filename, source, 0);
++ free(source);
+
++ if (!co) {
++ Py_BEGIN_ALLOW_THREADS
++ if (r) {
++ ap_log_rerror(APLOG_MARK, APLOG_ERR, errno, r,
++ "mod_wsgi (pid=%d, process='%s', application='%s'): "
++ "Could not compile source file '%s'.", getpid(),
++ process_group, application_group, filename);
++ }
++ else {
++ ap_log_error(APLOG_MARK, APLOG_ERR, errno, wsgi_server,
++ "mod_wsgi (pid=%d, process='%s', application='%s'): "
++ "Could not compile source file '%s'.", getpid(),
++ process_group, application_group, filename);
++ }
++ Py_END_ALLOW_THREADS
+ return NULL;
+ }
+
+- co = (PyObject *)PyNode_Compile(n, filename);
+- PyNode_Free(n);
+-
+- if (co)
+- m = PyImport_ExecCodeModuleEx((char *)name, co, (char *)filename);
++ m = PyImport_ExecCodeModuleEx((char *)name, co, (char *)filename);
+
+ Py_XDECREF(co);
+
+diff --git a/src/server/wsgi_python.h b/src/server/wsgi_python.h
+index fa06e2cb..3b34b731 100644
+--- a/src/server/wsgi_python.h
++++ b/src/server/wsgi_python.h
+@@ -43,7 +43,6 @@
+
+ #include "structmember.h"
+ #include "compile.h"
+-#include "node.h"
+ #include "osdefs.h"
+ #include "frameobject.h"
+
diff --git a/www-apache/mod_wsgi/mod_wsgi-4.7.1-r1.ebuild b/www-apache/mod_wsgi/mod_wsgi-4.7.1-r1.ebuild
index e5ae886e528e..759f60c5f6d0 100644
--- a/www-apache/mod_wsgi/mod_wsgi-4.7.1-r1.ebuild
+++ b/www-apache/mod_wsgi/mod_wsgi-4.7.1-r1.ebuild
@@ -3,7 +3,7 @@
EAPI=6
-PYTHON_COMPAT=( python3_{6,7,8,9} )
+PYTHON_COMPAT=( python3_{8..10} )
PYTHON_REQ_USE="threads(+)"
inherit apache-module python-single-r1
@@ -27,6 +27,10 @@ APACHE2_MOD_FILE="${S}/src/server/.libs/${PN}.so"
DOCFILES="README.rst"
+PATCHES=(
+ "${FILESDIR}/${P}-py310.patch"
+)
+
need_apache2
pkg_setup() {