lkml.org 
[lkml]   [2008]   [Aug]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH 2/2] uevent: handle duplicate uevent_var keys properly
add_uevent_var() appends the specified variable whether the new entry
has duplicate key or not. This patch makes add_uevent_var() to
override the existing entry if an entry with the same key is added
later. This will be used by CUSE (character device in userland) to
fake hotplug events.

Signed-off-by: Tejun Heo <tj@kernel.org>
---
lib/kobject_uevent.c | 33 ++++++++++++++++++++++-----------
1 files changed, 22 insertions(+), 11 deletions(-)
diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c
index ca215bc..64b1aaf 100644
--- a/lib/kobject_uevent.c
+++ b/lib/kobject_uevent.c
@@ -281,27 +281,38 @@ EXPORT_SYMBOL_GPL(kobject_uevent);
*/
int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...)
{
+ char *buf = &env->buf[env->buflen];
+ size_t avail = sizeof(env->buf) - env->buflen;
va_list args;
- int len;
+ int i, len, key_len;

- if (env->envp_idx >= ARRAY_SIZE(env->envp)) {
- WARN(1, KERN_ERR "add_uevent_var: too many keys\n");
+ va_start(args, format);
+ len = vsnprintf(buf, avail, format, args);
+ va_end(args);
+
+ if (len >= avail) {
+ printk(KERN_ERR "add_uevent_var: buffer size too small\n");
+ WARN_ON(1);
return -ENOMEM;
}

- va_start(args, format);
- len = vsnprintf(&env->buf[env->buflen],
- sizeof(env->buf) - env->buflen,
- format, args);
- va_end(args);
+ key_len = strchr(buf, '=') - buf;
+
+ for (i = 0; i < env->envp_idx; i++)
+ if (key_len == strchr(env->envp[i], '=') - env->envp[i] &&
+ !strncmp(buf, env->envp[i], key_len))
+ break;

- if (len >= (sizeof(env->buf) - env->buflen)) {
- WARN(1, KERN_ERR "add_uevent_var: buffer size too small\n");
+ if (i >= ARRAY_SIZE(env->envp)) {
+ printk(KERN_ERR "add_uevent_var: too many keys\n");
+ WARN_ON(1);
return -ENOMEM;
}

- env->envp[env->envp_idx++] = &env->buf[env->buflen];
+ env->envp[i] = &env->buf[env->buflen];
env->buflen += len + 1;
+ if (i == env->envp_idx)
+ env->envp_idx++;
return 0;
}
EXPORT_SYMBOL_GPL(add_uevent_var);
--
1.5.4.5


\
 
 \ /
  Last update: 2008-08-28 18:35    [from the cache]
©2003-2011 Jasper Spaans