summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPetr Viktorin <encukou@gmail.com>2021-06-10 15:45:03 +0200
committerPetr Viktorin <encukou@gmail.com>2021-06-10 16:28:43 +0200
commitb439f1c411a9479ccc03c16465cdff50fede79d3 (patch)
treed88e21650501126efada665e9aac726add05687e /src
parent823bd6c9497676580f755a4bd6c83b07be34616e (diff)
downloadmod_wsgi-b439f1c411a9479ccc03c16465cdff50fede79d3.tar.gz
Use Py_CompileString rather than PyParser_SimpleParseFile/PyNode_Compile
Diffstat (limited to 'src')
-rw-r--r--src/server/mod_wsgi.c68
-rw-r--r--src/server/wsgi_python.h1
2 files changed, 53 insertions, 16 deletions
diff --git a/src/server/mod_wsgi.c b/src/server/mod_wsgi.c
index b657a74..4f1d876 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 fa06e2c..3b34b73 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"