diff options
| author | Kay Sievers <kay.sievers@vrfy.org> | 2007-08-14 15:15:12 +0200 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-10-12 14:51:01 -0700 | 
| 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 949706c3362..626bdd3c3dd 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h @@ -29,6 +29,8 @@  #define KOBJ_NAME_LEN			20  #define UEVENT_HELPER_PATH_LEN		256 +#define UEVENT_NUM_ENVP			32	/* number of env pointers */ +#define UEVENT_BUFFER_SIZE		2048	/* buffer for the variables */  /* path to the userspace helper executed on an event */  extern char uevent_helper[]; @@ -111,11 +113,18 @@ struct kobj_type {  	struct attribute	** default_attrs;  }; +struct kobj_uevent_env { +	char *envp[UEVENT_NUM_ENVP]; +	int envp_idx; +	char buf[UEVENT_BUFFER_SIZE]; +	int buflen; +}; +  struct kset_uevent_ops {  	int (*filter)(struct kset *kset, struct kobject *kobj);  	const char *(*name)(struct kset *kset, struct kobject *kobj); -	int (*uevent)(struct kset *kset, struct kobject *kobj, char **envp, -			int num_envp, char *buffer, int buffer_size); +	int (*uevent)(struct kset *kset, struct kobject *kobj, +		      struct kobj_uevent_env *env);  };  /* @@ -275,10 +284,8 @@ int kobject_uevent(struct kobject *kobj, enum kobject_action action);  int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,  			char *envp[]); -int add_uevent_var(char **envp, int num_envp, int *cur_index, -			char *buffer, int buffer_size, int *cur_len, -			const char *format, ...) -	__attribute__((format (printf, 7, 8))); +int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...) +	__attribute__((format (printf, 2, 3)));  #else  static inline int kobject_uevent(struct kobject *kobj, enum kobject_action action)  { return 0; } @@ -287,9 +294,7 @@ static inline int kobject_uevent_env(struct kobject *kobj,  				      char *envp[])  { return 0; } -static inline int add_uevent_var(char **envp, int num_envp, int *cur_index, -				      char *buffer, int buffer_size, int *cur_len,  -				      const char *format, ...) +static inline int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...)  { return 0; }  #endif | 
