Commit 9b3fa47d authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Greg Kroah-Hartman

kobject: fix suppressing modalias in uevents delivered over netlink

The commit 4a336a23 ("kobject: copy env blob in one go") optimized
constructing uevent data for delivery over netlink by using the raw
environment buffer, instead of reconstructing it from individual
environment pointers. Unfortunately in doing so it broke suppressing
MODALIAS attribute for KOBJ_UNBIND events, as the code that suppressed this
attribute only adjusted the environment pointers, but left the buffer
itself alone. Let's fix it by making sure the offending attribute is
obliterated form the buffer as well.
Reported-by: default avatarTariq Toukan <tariqt@mellanox.com>
Reported-by: default avatarCasey Leedom <leedom@chelsio.com>
Fixes: 4a336a23 ("kobject: copy env blob in one go")
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f57ab9a0
...@@ -346,7 +346,8 @@ static int kobject_uevent_net_broadcast(struct kobject *kobj, ...@@ -346,7 +346,8 @@ static int kobject_uevent_net_broadcast(struct kobject *kobj,
static void zap_modalias_env(struct kobj_uevent_env *env) static void zap_modalias_env(struct kobj_uevent_env *env)
{ {
static const char modalias_prefix[] = "MODALIAS="; static const char modalias_prefix[] = "MODALIAS=";
int i; size_t len;
int i, j;
for (i = 0; i < env->envp_idx;) { for (i = 0; i < env->envp_idx;) {
if (strncmp(env->envp[i], modalias_prefix, if (strncmp(env->envp[i], modalias_prefix,
...@@ -355,11 +356,18 @@ static void zap_modalias_env(struct kobj_uevent_env *env) ...@@ -355,11 +356,18 @@ static void zap_modalias_env(struct kobj_uevent_env *env)
continue; continue;
} }
if (i != env->envp_idx - 1) len = strlen(env->envp[i]) + 1;
memmove(&env->envp[i], &env->envp[i + 1],
sizeof(env->envp[i]) * env->envp_idx - 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->envp_idx--;
env->buflen -= len;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment