plugins/python: use separate python interpreter for each plugin
On each plugin initialization we create a separate python interpreter which gets stored in the plugin_ctx. The main interpreter is stored in py_ctx and is used for creating more interpreters (if more plugins get loaded) and final python deinitialization. The "traceback" module import and the ImportBlocker initialization was moved, because it has to happen inside the plugin specific interpreters.
This commit is contained in:

committed by
Todd C. Miller

parent
99f8394182
commit
22c64f58c0
@@ -134,6 +134,8 @@ python_plugin_io_show_version(struct IOPluginContext *io_ctx, int verbose)
|
||||
{
|
||||
debug_decl(python_plugin_io_show_version, PYTHON_DEBUG_CALLBACKS);
|
||||
|
||||
PyThreadState_Swap(BASE_CTX(io_ctx)->py_interpreter);
|
||||
|
||||
if (verbose) {
|
||||
py_sudo_log(SUDO_CONV_INFO_MSG, "Python io plugin API version %d.%d\n", "%d.%d",
|
||||
SUDO_API_VERSION_GET_MAJOR(PY_IO_PLUGIN_VERSION),
|
||||
@@ -147,6 +149,7 @@ int
|
||||
python_plugin_io_log_ttyin(struct IOPluginContext *io_ctx, const char *buf, unsigned int len)
|
||||
{
|
||||
debug_decl(python_plugin_io_log_ttyin, PYTHON_DEBUG_CALLBACKS);
|
||||
PyThreadState_Swap(BASE_CTX(io_ctx)->py_interpreter);
|
||||
debug_return_int(python_plugin_api_rc_call(BASE_CTX(io_ctx), CALLBACK_PYNAME(log_ttyin),
|
||||
Py_BuildValue("(s#)", buf, len)));
|
||||
}
|
||||
@@ -155,6 +158,7 @@ int
|
||||
python_plugin_io_log_ttyout(struct IOPluginContext *io_ctx, const char *buf, unsigned int len)
|
||||
{
|
||||
debug_decl(python_plugin_io_log_ttyout, PYTHON_DEBUG_CALLBACKS);
|
||||
PyThreadState_Swap(BASE_CTX(io_ctx)->py_interpreter);
|
||||
debug_return_int(python_plugin_api_rc_call(BASE_CTX(io_ctx), CALLBACK_PYNAME(log_ttyout),
|
||||
Py_BuildValue("(s#)", buf, len)));
|
||||
}
|
||||
@@ -163,6 +167,7 @@ int
|
||||
python_plugin_io_log_stdin(struct IOPluginContext *io_ctx, const char *buf, unsigned int len)
|
||||
{
|
||||
debug_decl(python_plugin_io_log_stdin, PYTHON_DEBUG_CALLBACKS);
|
||||
PyThreadState_Swap(BASE_CTX(io_ctx)->py_interpreter);
|
||||
debug_return_int(python_plugin_api_rc_call(BASE_CTX(io_ctx), CALLBACK_PYNAME(log_stdin),
|
||||
Py_BuildValue("(s#)", buf, len)));
|
||||
}
|
||||
@@ -171,6 +176,7 @@ int
|
||||
python_plugin_io_log_stdout(struct IOPluginContext *io_ctx, const char *buf, unsigned int len)
|
||||
{
|
||||
debug_decl(python_plugin_io_log_stdout, PYTHON_DEBUG_CALLBACKS);
|
||||
PyThreadState_Swap(BASE_CTX(io_ctx)->py_interpreter);
|
||||
debug_return_int(python_plugin_api_rc_call(BASE_CTX(io_ctx), CALLBACK_PYNAME(log_stdout),
|
||||
Py_BuildValue("(s#)", buf, len)));
|
||||
}
|
||||
@@ -179,6 +185,7 @@ int
|
||||
python_plugin_io_log_stderr(struct IOPluginContext *io_ctx, const char *buf, unsigned int len)
|
||||
{
|
||||
debug_decl(python_plugin_io_log_stderr, PYTHON_DEBUG_CALLBACKS);
|
||||
PyThreadState_Swap(BASE_CTX(io_ctx)->py_interpreter);
|
||||
debug_return_int(python_plugin_api_rc_call(BASE_CTX(io_ctx), CALLBACK_PYNAME(log_stderr),
|
||||
Py_BuildValue("(s#)", buf, len)));
|
||||
}
|
||||
@@ -187,6 +194,7 @@ int
|
||||
python_plugin_io_change_winsize(struct IOPluginContext *io_ctx, unsigned int line, unsigned int cols)
|
||||
{
|
||||
debug_decl(python_plugin_io_change_winsize, PYTHON_DEBUG_CALLBACKS);
|
||||
PyThreadState_Swap(BASE_CTX(io_ctx)->py_interpreter);
|
||||
debug_return_int(python_plugin_api_rc_call(BASE_CTX(io_ctx), CALLBACK_PYNAME(change_winsize),
|
||||
Py_BuildValue("(ii)", line, cols)));
|
||||
}
|
||||
@@ -195,6 +203,7 @@ int
|
||||
python_plugin_io_log_suspend(struct IOPluginContext *io_ctx, int signo)
|
||||
{
|
||||
debug_decl(python_plugin_io_log_suspend, PYTHON_DEBUG_CALLBACKS);
|
||||
PyThreadState_Swap(BASE_CTX(io_ctx)->py_interpreter);
|
||||
debug_return_int(python_plugin_api_rc_call(BASE_CTX(io_ctx), CALLBACK_PYNAME(log_suspend),
|
||||
Py_BuildValue("(i)", signo)));
|
||||
}
|
||||
|
Reference in New Issue
Block a user