Browse Source

ALSA: opl3sa2 - Fix NULL dereference when suspending snd_opl3sa2

Fix the OOPS during a opl3sa2 card suspend
and resume if the driver is loaded but the card
is not found.

Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
Cc: <stable@kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Krzysztof Helt 16 years ago
parent
commit
dde332b660
1 changed files with 12 additions and 6 deletions
  1. 12 6
      sound/isa/opl3sa2.c

+ 12 - 6
sound/isa/opl3sa2.c

@@ -550,21 +550,27 @@ static int __devinit snd_opl3sa2_mixer(struct snd_card *card)
 #ifdef CONFIG_PM
 #ifdef CONFIG_PM
 static int snd_opl3sa2_suspend(struct snd_card *card, pm_message_t state)
 static int snd_opl3sa2_suspend(struct snd_card *card, pm_message_t state)
 {
 {
-	struct snd_opl3sa2 *chip = card->private_data;
+	if (card) {
+		struct snd_opl3sa2 *chip = card->private_data;
 
 
-	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
-	chip->wss->suspend(chip->wss);
-	/* power down */
-	snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D3);
+		snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+		chip->wss->suspend(chip->wss);
+		/* power down */
+		snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D3);
+	}
 
 
 	return 0;
 	return 0;
 }
 }
 
 
 static int snd_opl3sa2_resume(struct snd_card *card)
 static int snd_opl3sa2_resume(struct snd_card *card)
 {
 {
-	struct snd_opl3sa2 *chip = card->private_data;
+	struct snd_opl3sa2 *chip;
 	int i;
 	int i;
 
 
+	if (!card)
+		return 0;
+
+	chip = card->private_data;
 	/* power up */
 	/* power up */
 	snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D0);
 	snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D0);