From: Konstantin Khorenko <khore...@virtuozzo.com>

If a kernel modules is requested indirectly from inside a Container,
check is this modules is blacklisted on the Node first.

https://jira.sw.ru/browse/PSBM-127787

Signed-off-by: Konstantin Khorenko <khore...@virtuozzo.com>
Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>
---
 kernel/kmod.c |   25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/kernel/kmod.c b/kernel/kmod.c
index c8506fd92017..7915397fcf46 100644
--- a/kernel/kmod.c
+++ b/kernel/kmod.c
@@ -64,11 +64,11 @@ char modprobe_path[KMOD_PATH_LEN] = CONFIG_MODPROBE_PATH;
 
 static void free_modprobe_argv(struct subprocess_info *info)
 {
-       kfree(info->argv[3]); /* check call_modprobe() */
+       kfree(info->argv[4]); /* check call_modprobe() */
        kfree(info->argv);
 }
 
-static int call_modprobe(char *module_name, int wait)
+static int call_modprobe(char *module_name, int wait, int blacklist)
 {
        struct subprocess_info *info;
        static char *envp[] = {
@@ -78,7 +78,7 @@ static int call_modprobe(char *module_name, int wait)
                NULL
        };
 
-       char **argv = kmalloc(sizeof(char *[5]), GFP_KERNEL);
+       char **argv = kmalloc(sizeof(char *[6]), GFP_KERNEL);
        if (!argv)
                goto out;
 
@@ -88,9 +88,13 @@ static int call_modprobe(char *module_name, int wait)
 
        argv[0] = modprobe_path;
        argv[1] = "-q";
-       argv[2] = "--";
-       argv[3] = module_name;  /* check free_modprobe_argv() */
-       argv[4] = NULL;
+       if (blacklist)
+               argv[2] = "-b";
+       else
+               argv[2] = "-q"; /* just repeat argv[1] */
+       argv[3] = "--";
+       argv[4] = module_name;  /* check free_modprobe_argv() */
+       argv[5] = NULL;
 
        info = call_usermodehelper_setup(modprobe_path, argv, envp, GFP_KERNEL,
                                         NULL, free_modprobe_argv, NULL);
@@ -127,6 +131,7 @@ int __request_module(bool wait, const char *fmt, ...)
 {
        va_list args;
        char module_name[MODULE_NAME_LEN];
+       bool blacklist;
        int ret;
 
        /*
@@ -154,6 +159,12 @@ int __request_module(bool wait, const char *fmt, ...)
        /* Check that module functionality is permitted */
        if (!module_payload_allowed(module_name))
                return -EPERM;
+       /*
+        * This function may be called from ve0, where standard behaviour
+        * is not to use blacklist. So, we request blacklist reading only
+        * if we're inside CT.
+        */
+       blacklist = !ve_is_super(get_exec_env());
 
        ret = security_kernel_module_request(module_name);
        if (ret)
@@ -178,7 +189,7 @@ int __request_module(bool wait, const char *fmt, ...)
 
        trace_module_request(module_name, wait, _RET_IP_);
 
-       ret = call_modprobe(module_name, wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC);
+       ret = call_modprobe(module_name, wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC, 
blacklist);
 
        atomic_inc(&kmod_concurrent_max);
        wake_up(&kmod_wq);


_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to