param: fix lots of bugs with writing charp params from sysfs, by leaking mem.
commit9f00eee2ffab59cb85ecf1de54282c7fb4669565
authorRusty Russell <rusty@rustcorp.com.au>
Thu, 29 Oct 2009 14:56:16 +0000 (29 08:56 -0600)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 10 Nov 2009 00:22:17 +0000 (9 16:22 -0800)
treee92ca436db4ee3f89004a5018086664bc09926d7
parent05fe6c842ab23f6e823ad87a84adab73ab60beaa
param: fix lots of bugs with writing charp params from sysfs, by leaking mem.

commit 65afac7d80ab3bc9f81e75eafb71eeb92a3ebdef upstream.

e180a6b7759a "param: fix charp parameters set via sysfs" fixed the case
where charp parameters written via sysfs were freed, leaving drivers
accessing random memory.

Unfortunately, storing a flag in the kparam struct was a bad idea: it's
rodata so setting it causes an oops on some archs.  But that's not all:

1) module_param_array() on charp doesn't work reliably, since we use an
   uninitialized temporary struct kernel_param.
2) there's a fundamental race if a module uses this parameter and then
   it's changed: they will still access the old, freed, memory.

The simplest fix (ie. for 2.6.32) is to never free the memory.  This
prevents all these problems, at cost of a memory leak.  In practice, there
are only 18 places where a charp is writable via sysfs, and all are
root-only writable.

Reported-by: Takashi Iwai <tiwai@suse.de>
Cc: Sitsofe Wheeler <sitsofe@yahoo.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
include/linux/moduleparam.h
kernel/params.c