diff options
| author | Lucas De Marchi <lucas.demarchi@profusion.mobi> | 2013-04-30 15:28:03 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-04-30 17:04:06 -0700 | 
| commit | f634460c90751da21745eec7a220edf76c7d0c76 (patch) | |
| tree | 1f6e389c735fa2fca650e5b15c1cc81c1125b34a | |
| parent | 938e4b22e2a7d0f6f3962e601339347b2d8e09f5 (diff) | |
| download | olio-linux-3.10-f634460c90751da21745eec7a220edf76c7d0c76.tar.xz olio-linux-3.10-f634460c90751da21745eec7a220edf76c7d0c76.zip  | |
kmod: split call to call_usermodehelper_fns()
Use call_usermodehelper_setup() + call_usermodehelper_exec() instead of
calling call_usermodehelper_fns().  In case the latter returns -ENOMEM the
cleanup function may had not been called - in this case we would not free
argv and module_name.
Signed-off-by: Lucas De Marchi <lucas.demarchi@profusion.mobi>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: David Howells <dhowells@redhat.com>
Cc: James Morris <james.l.morris@oracle.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Tejun Heo <tj@kernel.org>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | kernel/kmod.c | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/kernel/kmod.c b/kernel/kmod.c index e11ea14ac01..9941a4f155d 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c @@ -77,6 +77,7 @@ static void free_modprobe_argv(struct subprocess_info *info)  static int call_modprobe(char *module_name, int wait)  { +	struct subprocess_info *info;  	static char *envp[] = {  		"HOME=/",  		"TERM=linux", @@ -98,8 +99,15 @@ static int call_modprobe(char *module_name, int wait)  	argv[3] = module_name;	/* check free_modprobe_argv() */  	argv[4] = NULL; -	return call_usermodehelper_fns(modprobe_path, argv, envp, -		wait | UMH_KILLABLE, NULL, free_modprobe_argv, NULL); +	info = call_usermodehelper_setup(modprobe_path, argv, envp, GFP_KERNEL, +					 NULL, free_modprobe_argv, NULL); +	if (!info) +		goto free_module_name; + +	return call_usermodehelper_exec(info, wait | UMH_KILLABLE); + +free_module_name: +	kfree(module_name);  free_argv:  	kfree(argv);  out:  |