]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - lib/kobject_uevent.c
lib/strscpy: Shut up KASAN false-positives in strscpy()
[mirror_ubuntu-bionic-kernel.git] / lib / kobject_uevent.c
index c3e84edc47c965d40199b652ba78876cdaa9c70c..37fe18c06f7f8a0898b762a6040b1c7463a3e9c5 100644 (file)
@@ -346,7 +346,8 @@ static int kobject_uevent_net_broadcast(struct kobject *kobj,
 static void zap_modalias_env(struct kobj_uevent_env *env)
 {
        static const char modalias_prefix[] = "MODALIAS=";
-       int i;
+       size_t len;
+       int i, j;
 
        for (i = 0; i < env->envp_idx;) {
                if (strncmp(env->envp[i], modalias_prefix,
@@ -355,11 +356,18 @@ static void zap_modalias_env(struct kobj_uevent_env *env)
                        continue;
                }
 
-               if (i != env->envp_idx - 1)
-                       memmove(&env->envp[i], &env->envp[i + 1],
-                               sizeof(env->envp[i]) * env->envp_idx - 1);
+               len = strlen(env->envp[i]) + 1;
+
+               if (i != env->envp_idx - 1) {
+                       memmove(env->envp[i], env->envp[i + 1],
+                               env->buflen - len);
+
+                       for (j = i; j < env->envp_idx - 1; j++)
+                               env->envp[j] = env->envp[j + 1] - len;
+               }
 
                env->envp_idx--;
+               env->buflen -= len;
        }
 }
 
@@ -386,6 +394,13 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
        int i = 0;
        int retval = 0;
 
+       /*
+        * Mark "remove" event done regardless of result, for some subsystems
+        * do not want to re-trigger "remove" event via automatic cleanup.
+        */
+       if (action == KOBJ_REMOVE)
+               kobj->state_remove_uevent_sent = 1;
+
        pr_debug("kobject: '%s' (%p): %s\n",
                 kobject_name(kobj), kobj, __func__);
 
@@ -487,10 +502,6 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
                kobj->state_add_uevent_sent = 1;
                break;
 
-       case KOBJ_REMOVE:
-               kobj->state_remove_uevent_sent = 1;
-               break;
-
        case KOBJ_UNBIND:
                zap_modalias_env(env);
                break;