hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/sound/core/sound_oss.c
....@@ -1,22 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Advanced Linux Sound Architecture
34 * Copyright (c) by Jaroslav Kysela <perex@perex.cz>
4
- *
5
- *
6
- * This program is free software; you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License as published by
8
- * the Free Software Foundation; either version 2 of the License, or
9
- * (at your option) any later version.
10
- *
11
- * This program is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- * GNU General Public License for more details.
15
- *
16
- * You should have received a copy of the GNU General Public License
17
- * along with this program; if not, write to the Free Software
18
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
- *
205 */
216
227 #include <linux/init.h>
....@@ -177,7 +162,6 @@
177162 mutex_unlock(&sound_oss_mutex);
178163 return -ENOENT;
179164 }
180
- unregister_sound_special(minor);
181165 switch (SNDRV_MINOR_OSS_DEVICE(minor)) {
182166 case SNDRV_MINOR_OSS_PCM:
183167 track2 = SNDRV_MINOR_OSS(cidx, SNDRV_MINOR_OSS_AUDIO);
....@@ -189,12 +173,18 @@
189173 track2 = SNDRV_MINOR_OSS(cidx, SNDRV_MINOR_OSS_DMMIDI1);
190174 break;
191175 }
192
- if (track2 >= 0) {
193
- unregister_sound_special(track2);
176
+ if (track2 >= 0)
194177 snd_oss_minors[track2] = NULL;
195
- }
196178 snd_oss_minors[minor] = NULL;
197179 mutex_unlock(&sound_oss_mutex);
180
+
181
+ /* call unregister_sound_special() outside sound_oss_mutex;
182
+ * otherwise may deadlock, as it can trigger the release of a card
183
+ */
184
+ unregister_sound_special(minor);
185
+ if (track2 >= 0)
186
+ unregister_sound_special(track2);
187
+
198188 kfree(mptr);
199189 return 0;
200190 }