aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMariusz Kozlowski <m.kozlowski@tuxland.pl>2007-10-09 04:34:06 -0400
committerJaroslav Kysela <perex@perex.cz>2007-10-16 10:51:06 -0400
commit2469049e728ee0542d6617f81311a18a14e73826 (patch)
tree4a6d5f67c89107f01271f3fff28568928e8b29d1
parent1e74190bc0f8a5ab7e83bdf6688fcaebbed25316 (diff)
[ALSA] sound: snd_register_device_for_dev fix
snd_register_device_for_dev() can oops when device_create() returns ERR_PTR(err). Scenario: preg->dev = device_create(...); /* fails */ if (preg->dev) /* contains ERR_PTR(err) */ dev_set_drvdata(preg->dev, private_data); and dev_set_drvdata() looks like this: static inline void dev_set_drvdata (struct device *dev, void *data) { dev->driver_data = data; <--- boom } This patch should prevent that. Signed-off-by: Mariusz Kozlowski <m.kozlowski@tuxland.pl> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
-rw-r--r--sound/core/sound.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sound/core/sound.c b/sound/core/sound.c
index 8dc7a3b32b98..f6ebce08b537 100644
--- a/sound/core/sound.c
+++ b/sound/core/sound.c
@@ -266,6 +266,14 @@ int snd_register_device_for_dev(int type, struct snd_card *card, int dev,
266 snd_minors[minor] = preg; 266 snd_minors[minor] = preg;
267 preg->dev = device_create(sound_class, device, MKDEV(major, minor), 267 preg->dev = device_create(sound_class, device, MKDEV(major, minor),
268 "%s", name); 268 "%s", name);
269 if (IS_ERR(preg->dev)) {
270 snd_minors[minor] = NULL;
271 mutex_unlock(&sound_mutex);
272 minor = PTR_ERR(preg->dev);
273 kfree(preg);
274 return minor;
275 }
276
269 if (preg->dev) 277 if (preg->dev)
270 dev_set_drvdata(preg->dev, private_data); 278 dev_set_drvdata(preg->dev, private_data);
271 279