summaryrefslogtreecommitdiff
path: root/www-servers/uwsgi/files/uwsgi-2.0.19.1-pynode-compile.patch
blob: 6bcf04ae2bc37060c43337696c110260af97065a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
https://github.com/unbit/uwsgi/commit/8c890c84604a0477b46a66eab8a620733f596cc8

From 8c890c84604a0477b46a66eab8a620733f596cc8 Mon Sep 17 00:00:00 2001
From: Riccardo Magliocchetti <riccardo.magliocchetti@gmail.com>
Date: Sun, 22 Nov 2020 18:20:19 +0100
Subject: [PATCH] plugins/python: use Py_CompileString

Instead of the deprecated PyParser_SimpleParseString, PyParser_SimpleParseFile
and PyNode_Compile.
While at it fixup a possible null pointer dereference when uwsgi_open_and_read
returns an empty string.

See https://bugs.python.org/issue40939
---
 plugins/python/pyloader.c      | 12 +-----------
 plugins/python/python_plugin.c | 36 ++++++++++++++--------------------
 2 files changed, 16 insertions(+), 32 deletions(-)

diff --git a/plugins/python/pyloader.c b/plugins/python/pyloader.c
index a63c375b5..d8ab6fe35 100644
--- a/plugins/python/pyloader.c
+++ b/plugins/python/pyloader.c
@@ -757,25 +757,15 @@ PyObject *uwsgi_eval_loader(void *arg1) {
 
 	PyObject *wsgi_eval_module, *wsgi_eval_callable = NULL;
 
-	struct _node *wsgi_eval_node = NULL;
 	PyObject *wsgi_compiled_node;
 
-	wsgi_eval_node = PyParser_SimpleParseString(code, Py_file_input);
-	if (!wsgi_eval_node) {
-		PyErr_Print();
-		uwsgi_log( "failed to parse <eval> code\n");
-		exit(UWSGI_FAILED_APP_CODE);
-	}
-
-	wsgi_compiled_node = (PyObject *) PyNode_Compile(wsgi_eval_node, "uwsgi_eval_config");
-
+	wsgi_compiled_node = Py_CompileString(code, "uwsgi_eval_config", Py_file_input);
 	if (!wsgi_compiled_node) {
 		PyErr_Print();
 		uwsgi_log( "failed to compile eval code\n");
 		exit(UWSGI_FAILED_APP_CODE);
 	}
 
-
 	wsgi_eval_module = PyImport_ExecCodeModule("uwsgi_eval_config", wsgi_compiled_node);
 	if (!wsgi_eval_module) {
 		PyErr_Print();
diff --git a/plugins/python/python_plugin.c b/plugins/python/python_plugin.c
index 37d0b7bbf..79f29d43c 100644
--- a/plugins/python/python_plugin.c
+++ b/plugins/python/python_plugin.c
@@ -473,8 +473,7 @@ UWSGI_RELEASE_GIL
 
 PyObject *uwsgi_pyimport_by_filename(char *name, char *filename) {
 
-	FILE *pyfile;
-	struct _node *py_file_node = NULL;
+	char *pycontent;
 	PyObject *py_compiled_node, *py_file_module;
 	int is_a_package = 0;
 	struct stat pystat;
@@ -483,7 +482,7 @@ PyObject *uwsgi_pyimport_by_filename(char *name, char *filename) {
 
 	if (!uwsgi_check_scheme(filename)) {
 
-		pyfile = fopen(filename, "r");
+		FILE *pyfile = fopen(filename, "r");
 		if (!pyfile) {
 			uwsgi_log("failed to open python file %s\n", filename);
 			return NULL;
@@ -507,37 +506,32 @@ PyObject *uwsgi_pyimport_by_filename(char *name, char *filename) {
 			}
 		}
 
-		py_file_node = PyParser_SimpleParseFile(pyfile, real_filename, Py_file_input);
-		if (!py_file_node) {
-			PyErr_Print();
-			uwsgi_log("failed to parse file %s\n", real_filename);
-			if (is_a_package)
+		fclose(pyfile);
+		pycontent = uwsgi_simple_file_read(real_filename);
+
+		if (!pycontent) {
+			if (is_a_package) {
 				free(real_filename);
-			fclose(pyfile);
+			}
+			uwsgi_log("no data read from file %s\n", real_filename);
 			return NULL;
 		}
 
-		fclose(pyfile);
 	}
 	else {
 		size_t pycontent_size = 0;
-		char *pycontent = uwsgi_open_and_read(filename, &pycontent_size, 1, NULL);
+		pycontent = uwsgi_open_and_read(filename, &pycontent_size, 1, NULL);
 
-		if (pycontent) {
-			py_file_node = PyParser_SimpleParseString(pycontent, Py_file_input);
-			if (!py_file_node) {
-				PyErr_Print();
-				uwsgi_log("failed to parse url %s\n", real_filename);
-				return NULL;
-			}
+		if (!pycontent) {
+			uwsgi_log("no data read from url %s\n", real_filename);
+			return NULL;
 		}
 	}
 
-	py_compiled_node = (PyObject *) PyNode_Compile(py_file_node, real_filename);
-
+	py_compiled_node = Py_CompileString(pycontent, real_filename, Py_file_input);
 	if (!py_compiled_node) {
 		PyErr_Print();
-		uwsgi_log("failed to compile python file %s\n", real_filename);
+		uwsgi_log("failed to compile %s\n", real_filename);
 		return NULL;
 	}