diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2007-08-14 09:15:12 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-10-12 17:51:01 -0400 |
commit | 7eff2e7a8b65c25920207324e56611150eb1cd9a (patch) | |
tree | 02a0eeba9d25d996233e30c18f258dfae0ae2139 /include/linux/kobject.h | |
parent | 8380770c842faef3001e44662953d64ad9a93663 (diff) |
Driver core: change add_uevent_var to use a struct
This changes the uevent buffer functions to use a struct instead of a
long list of parameters. It does no longer require the caller to do the
proper buffer termination and size accounting, which is currently wrong
in some places. It fixes a known bug where parts of the uevent
environment are overwritten because of wrong index calculations.
Many thanks to Mathieu Desnoyers for finding bugs and improving the
error handling.
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'include/linux/kobject.h')
-rw-r--r-- | include/linux/kobject.h | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/include/linux/kobject.h b/include/linux/kobject.h index 949706c33622..626bdd3c3dd9 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h | |||
@@ -29,6 +29,8 @@ | |||
29 | 29 | ||
30 | #define KOBJ_NAME_LEN 20 | 30 | #define KOBJ_NAME_LEN 20 |
31 | #define UEVENT_HELPER_PATH_LEN 256 | 31 | #define UEVENT_HELPER_PATH_LEN 256 |
32 | #define UEVENT_NUM_ENVP 32 /* number of env pointers */ | ||
33 | #define UEVENT_BUFFER_SIZE 2048 /* buffer for the variables */ | ||
32 | 34 | ||
33 | /* path to the userspace helper executed on an event */ | 35 | /* path to the userspace helper executed on an event */ |
34 | extern char uevent_helper[]; | 36 | extern char uevent_helper[]; |
@@ -111,11 +113,18 @@ struct kobj_type { | |||
111 | struct attribute ** default_attrs; | 113 | struct attribute ** default_attrs; |
112 | }; | 114 | }; |
113 | 115 | ||
116 | struct kobj_uevent_env { | ||
117 | char *envp[UEVENT_NUM_ENVP]; | ||
118 | int envp_idx; | ||
119 | char buf[UEVENT_BUFFER_SIZE]; | ||
120 | int buflen; | ||
121 | }; | ||
122 | |||
114 | struct kset_uevent_ops { | 123 | struct kset_uevent_ops { |
115 | int (*filter)(struct kset *kset, struct kobject *kobj); | 124 | int (*filter)(struct kset *kset, struct kobject *kobj); |
116 | const char *(*name)(struct kset *kset, struct kobject *kobj); | 125 | const char *(*name)(struct kset *kset, struct kobject *kobj); |
117 | int (*uevent)(struct kset *kset, struct kobject *kobj, char **envp, | 126 | int (*uevent)(struct kset *kset, struct kobject *kobj, |
118 | int num_envp, char *buffer, int buffer_size); | 127 | struct kobj_uevent_env *env); |
119 | }; | 128 | }; |
120 | 129 | ||
121 | /* | 130 | /* |
@@ -275,10 +284,8 @@ int kobject_uevent(struct kobject *kobj, enum kobject_action action); | |||
275 | int kobject_uevent_env(struct kobject *kobj, enum kobject_action action, | 284 | int kobject_uevent_env(struct kobject *kobj, enum kobject_action action, |
276 | char *envp[]); | 285 | char *envp[]); |
277 | 286 | ||
278 | int add_uevent_var(char **envp, int num_envp, int *cur_index, | 287 | int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...) |
279 | char *buffer, int buffer_size, int *cur_len, | 288 | __attribute__((format (printf, 2, 3))); |
280 | const char *format, ...) | ||
281 | __attribute__((format (printf, 7, 8))); | ||
282 | #else | 289 | #else |
283 | static inline int kobject_uevent(struct kobject *kobj, enum kobject_action action) | 290 | static inline int kobject_uevent(struct kobject *kobj, enum kobject_action action) |
284 | { return 0; } | 291 | { return 0; } |
@@ -287,9 +294,7 @@ static inline int kobject_uevent_env(struct kobject *kobj, | |||
287 | char *envp[]) | 294 | char *envp[]) |
288 | { return 0; } | 295 | { return 0; } |
289 | 296 | ||
290 | static inline int add_uevent_var(char **envp, int num_envp, int *cur_index, | 297 | static inline int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...) |
291 | char *buffer, int buffer_size, int *cur_len, | ||
292 | const char *format, ...) | ||
293 | { return 0; } | 298 | { return 0; } |
294 | #endif | 299 | #endif |
295 | 300 | ||