From 2b5941df74806d344c59ec0ca126b81cc7bbffe1 Mon Sep 17 00:00:00 2001 From: Max Romanov Date: Tue, 8 Feb 2022 12:04:41 +0300 Subject: Python: fixing incorrect function object dereference. The __call__ method can be native and not be a PyFunction type. A type check is thus required before accessing op_code and other fields. Reproduced on Ubuntu 21.04, Python 3.9.4 and Falcon framework: here, the App.__call__ method is compiled with Cython, so accessing op_code->co_flags is invalid; accidentally, the COROUTINE bit is set which forces the Python module into the ASGI mode. The workaround is explicit protocol specification. Note: it is impossible to specify the legacy mode for ASGI. --- src/python/nxt_python_asgi.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'src/python/nxt_python_asgi.c') diff --git a/src/python/nxt_python_asgi.c b/src/python/nxt_python_asgi.c index 354e3a81..2d3efc7d 100644 --- a/src/python/nxt_python_asgi.c +++ b/src/python/nxt_python_asgi.c @@ -117,15 +117,20 @@ nxt_python_asgi_get_func(PyObject *obj) if (PyMethod_Check(call)) { obj = PyMethod_GET_FUNCTION(call); - Py_INCREF(obj); - Py_DECREF(call); + if (PyFunction_Check(obj)) { + Py_INCREF(obj); - return obj; + } else { + obj = NULL; + } + + } else { + obj = NULL; } Py_DECREF(call); - return NULL; + return obj; } @@ -161,8 +166,9 @@ nxt_python_asgi_init(nxt_unit_init_t *init, nxt_python_proto_t *proto) for (i = 0; i < nxt_py_targets->count; i++) { func = nxt_python_asgi_get_func(nxt_py_targets->target[i].application); if (nxt_slow_path(func == NULL)) { - nxt_unit_alert(NULL, "Python cannot find function for callable"); - return NXT_UNIT_ERROR; + nxt_unit_debug(NULL, "asgi: cannot find function for callable, " + "unable to check for legacy mode (#%d)", i); + continue; } code = (PyCodeObject *) PyFunction_GET_CODE(func); -- cgit From bf6282b16ca192ace20b35711ed9b8a8014e63d4 Mon Sep 17 00:00:00 2001 From: Max Romanov Date: Wed, 9 Feb 2022 10:37:51 +0300 Subject: Python: fixing debug message field type. Introduced in the 78864c9d5ba8 commit. Sorry about that. --- src/python/nxt_python_asgi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/python/nxt_python_asgi.c') diff --git a/src/python/nxt_python_asgi.c b/src/python/nxt_python_asgi.c index 2d3efc7d..91af8f4b 100644 --- a/src/python/nxt_python_asgi.c +++ b/src/python/nxt_python_asgi.c @@ -167,7 +167,8 @@ nxt_python_asgi_init(nxt_unit_init_t *init, nxt_python_proto_t *proto) func = nxt_python_asgi_get_func(nxt_py_targets->target[i].application); if (nxt_slow_path(func == NULL)) { nxt_unit_debug(NULL, "asgi: cannot find function for callable, " - "unable to check for legacy mode (#%d)", i); + "unable to check for legacy mode (#%d)", + (int) i); continue; } -- cgit