按源保护 PythonPlugin inittab 初始化边界
This commit is contained in:
@@ -93,11 +93,15 @@ grep -F 'return vsnprintf(buffer, size, fmt, args);' \
|
||||
grep -F 'class PythonPlugin' "$linuxcnc_root/src/emc/pythonplugin/python_plugin.hh" >/dev/null
|
||||
grep -F 'PLUGIN_PYTHON_NOT_INITIALIZED = -12,' "$linuxcnc_root/src/emc/pythonplugin/python_plugin.hh" >/dev/null
|
||||
grep -F 'PLUGIN_BAD_PATH = -5,' "$linuxcnc_root/src/emc/pythonplugin/python_plugin.hh" >/dev/null
|
||||
grep -F 'PLUGIN_INITTAB_FAILED = -7 ,' "$linuxcnc_root/src/emc/pythonplugin/python_plugin.hh" >/dev/null
|
||||
grep -F 'PLUGIN_EXCEPTION_DURING_PATH_PREPEND = -9,' "$linuxcnc_root/src/emc/pythonplugin/python_plugin.hh" >/dev/null
|
||||
grep -F 'PLUGIN_EXCEPTION_DURING_PATH_APPEND = -10,' "$linuxcnc_root/src/emc/pythonplugin/python_plugin.hh" >/dev/null
|
||||
grep -F 'PLUGIN_NO_CALLABLE = 1,' "$linuxcnc_root/src/emc/pythonplugin/python_plugin.hh" >/dev/null
|
||||
grep -F 'PLUGIN_EXCEPTION = 2' "$linuxcnc_root/src/emc/pythonplugin/python_plugin.hh" >/dev/null
|
||||
grep -F 'PythonPlugin::instantiate' "$linuxcnc_root/src/emc/pythonplugin/python_plugin.cc" >/dev/null
|
||||
grep -F 'for (int i = 0; inittab[i].name != NULL; i++) {' "$linuxcnc_root/src/emc/pythonplugin/python_plugin.cc" >/dev/null
|
||||
grep -F 'if (module == NULL) {' "$linuxcnc_root/src/emc/pythonplugin/python_plugin.cc" >/dev/null
|
||||
grep -F 'status = PLUGIN_INITTAB_FAILED;' "$linuxcnc_root/src/emc/pythonplugin/python_plugin.cc" >/dev/null
|
||||
grep -F 'if (status < PLUGIN_OK)' "$linuxcnc_root/src/emc/pythonplugin/python_plugin.cc" >/dev/null
|
||||
grep -F 'if (auto inistring = inifile.findString("TOPLEVEL", section)) {' \
|
||||
"$linuxcnc_root/src/emc/pythonplugin/python_plugin.cc" >/dev/null
|
||||
@@ -327,6 +331,7 @@ for needle in [
|
||||
|
||||
python_plugin_shim = Path("core/wasm_shims/pythonplugin/python_plugin.cc").read_text(encoding="utf-8")
|
||||
python_plugin_probe = Path("core/wasm_shims/pythonplugin/python_plugin_probe_main.cc").read_text(encoding="utf-8")
|
||||
python_plugin_inittab_probe = Path("core/wasm_shims/pythonplugin/python_plugin_inittab_probe_main.cc").read_text(encoding="utf-8")
|
||||
python_c_api_shim = Path("core/wasm_shims/python_c_api_shim.cc").read_text(encoding="utf-8")
|
||||
for forbidden in [
|
||||
"bp::exec(",
|
||||
@@ -340,6 +345,8 @@ for needle in [
|
||||
'find_ini_value(iniFilename, section, "TOPLEVEL", toplevel)',
|
||||
"realpath(toplevel.c_str(), resolved_path) == nullptr",
|
||||
"status = PLUGIN_BAD_PATH;",
|
||||
"status = PLUGIN_INITTAB_FAILED;",
|
||||
"failed to initialize built-in module",
|
||||
'check_python_path_entries(iniFilename,',
|
||||
"PLUGIN_EXCEPTION_DURING_PATH_PREPEND",
|
||||
"PLUGIN_EXCEPTION_DURING_PATH_APPEND",
|
||||
@@ -351,6 +358,16 @@ for needle in [
|
||||
]:
|
||||
if needle not in python_plugin_shim:
|
||||
raise SystemExit(f"PythonPlugin wasm shim missing disabled-python boundary: {needle}")
|
||||
for needle in [
|
||||
"PythonPlugin::PythonPlugin(struct _inittab*) reports PLUGIN_INITTAB_FAILED",
|
||||
"PythonPlugin *plugin = PythonPlugin::instantiate(bad_modules);",
|
||||
"plugin != nullptr",
|
||||
"python_plugin->plugin_status() != PLUGIN_INITTAB_FAILED",
|
||||
"python_plugin->usable()",
|
||||
'python_plugin->last_errmsg() != "failed to initialize built-in module"',
|
||||
]:
|
||||
if needle not in python_plugin_inittab_probe:
|
||||
raise SystemExit(f"PythonPlugin inittab probe missing first-caller status assertion: {needle}")
|
||||
for needle in [
|
||||
"PLUGIN_NO_SECTION",
|
||||
"PLUGIN_BAD_INIFILE",
|
||||
@@ -437,6 +454,7 @@ for phrase in [
|
||||
"must not execute `bp::exec`, `bp::exec_file`, or",
|
||||
"inactive-DB return values",
|
||||
"negative-status short-circuit behavior",
|
||||
"first-caller `_inittab` `PLUGIN_INITTAB_FAILED` edge",
|
||||
"preserve the `TOPLEVEL` missing-path `PLUGIN_BAD_PATH` edge",
|
||||
"preserve `PATH_PREPEND` and `PATH_APPEND` tilde-expansion failure statuses",
|
||||
"LinuxCNC `rcs_print_error` split entry points",
|
||||
|
||||
Reference in New Issue
Block a user