From 4da9b6f00a16e3ae10e9f45de46d78337420de38 Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Tue, 10 Apr 2018 20:11:16 +0100 Subject: [PATCH] Ensure BagFile.GetStream returns unique streams. GetStream must return a unique stream on each call to ensure multiple callers can read their streams without affecting each other. As bag file returned multiple references to the same underlying stream, it was possible for multiple callers to disturb reads of each other, and thus read bad audio from each file. --- OpenRA.Mods.Cnc/FileSystem/BagFile.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/OpenRA.Mods.Cnc/FileSystem/BagFile.cs b/OpenRA.Mods.Cnc/FileSystem/BagFile.cs index ee8966bcd8..e187ed0567 100644 --- a/OpenRA.Mods.Cnc/FileSystem/BagFile.cs +++ b/OpenRA.Mods.Cnc/FileSystem/BagFile.cs @@ -46,8 +46,6 @@ namespace OpenRA.Mods.Cnc.FileSystem if (!index.TryGetValue(filename, out entry)) return null; - s.Seek(entry.Offset, SeekOrigin.Begin); - var waveHeaderMemoryStream = new MemoryStream(); var channels = (entry.Flags & 1) > 0 ? 2 : 1; @@ -100,7 +98,8 @@ namespace OpenRA.Mods.Cnc.FileSystem waveHeaderMemoryStream.Seek(0, SeekOrigin.Begin); // Construct a merged stream - var mergedStream = new MergedStream(waveHeaderMemoryStream, s); + var waveStream = SegmentStream.CreateWithoutOwningStream(s, entry.Offset, (int)entry.Length); + var mergedStream = new MergedStream(waveHeaderMemoryStream, waveStream); mergedStream.SetLength(waveHeaderMemoryStream.Length + entry.Length); return mergedStream;