瀏覽代碼

sound: rawmidi: fix double init when opening MIDI device with O_APPEND

Commit 9a1b64caac82aa02cb74587ffc798e6f42c6170a in 2.6.30 moved the
substream initialization code to where it would be executed every time
the substream is opened.

This had the consequence that any further opening would drop and leak
the data in the existing buffer, and that the device driver's open
callback would be called multiple times, unexpectedly.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Cc: <stable@kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Clemens Ladisch 15 年之前
父節點
當前提交
8579d2d777
共有 1 個文件被更改,包括 12 次插入10 次删除
  1. 12 10
      sound/core/rawmidi.c

+ 12 - 10
sound/core/rawmidi.c

@@ -266,17 +266,19 @@ static int open_substream(struct snd_rawmidi *rmidi,
 {
 {
 	int err;
 	int err;
 
 
-	err = snd_rawmidi_runtime_create(substream);
-	if (err < 0)
-		return err;
-	err = substream->ops->open(substream);
-	if (err < 0)
-		return err;
-	substream->opened = 1;
-	if (substream->use_count++ == 0)
+	if (substream->use_count == 0) {
+		err = snd_rawmidi_runtime_create(substream);
+		if (err < 0)
+			return err;
+		err = substream->ops->open(substream);
+		if (err < 0)
+			return err;
+		substream->opened = 1;
 		substream->active_sensing = 0;
 		substream->active_sensing = 0;
-	if (mode & SNDRV_RAWMIDI_LFLG_APPEND)
-		substream->append = 1;
+		if (mode & SNDRV_RAWMIDI_LFLG_APPEND)
+			substream->append = 1;
+	}
+	substream->use_count++;
 	rmidi->streams[substream->stream].substream_opened++;
 	rmidi->streams[substream->stream].substream_opened++;
 	return 0;
 	return 0;
 }
 }