From 263ccbdc234a837821afae5342e30d9653dd49b6 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Sat, 21 Nov 2015 19:32:43 -0800 Subject: [PATCH] Fix misalined pointer read in the PCM audio provider --- libaegisub/audio/provider_pcm.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/libaegisub/audio/provider_pcm.cpp b/libaegisub/audio/provider_pcm.cpp index db1442044..d52696180 100644 --- a/libaegisub/audio/provider_pcm.cpp +++ b/libaegisub/audio/provider_pcm.cpp @@ -65,14 +65,16 @@ protected: PCMAudioProvider(fs::path const& filename) : file(filename) { } template - const T *Read(UInt *data_left) { + T Read(UInt *data_left) { if (*data_left < sizeof(T)) throw file_ended(); if (file.size() - file_pos < sizeof(T)) throw file_ended(); auto data = file.read(file_pos, sizeof(T)); file_pos += sizeof(T); *data_left -= sizeof(T); - return reinterpret_cast(data); + T ret; + memcpy(&ret, data, sizeof(T)); + return ret; } std::vector index_points; @@ -153,17 +155,17 @@ public: try { auto data_left = std::numeric_limits::max(); - if (*Read(&data_left) != Impl::riff_id()) + if (Read(&data_left) != Impl::riff_id()) throw AudioDataNotFound("File is not a RIFF file"); - data_left = Impl::data_size(*Read(&data_left)); + data_left = Impl::data_size(Read(&data_left)); - if (*Read(&data_left) != Impl::wave_id()) + if (Read(&data_left) != Impl::wave_id()) throw AudioDataNotFound("File is not a RIFF WAV file"); while (data_left) { - auto chunk_fcc = *Read(&data_left); - auto chunk_size = Impl::chunk_size(*Read(&data_left)); + auto chunk_fcc = Read(&data_left); + auto chunk_size = Impl::chunk_size(Read(&data_left)); data_left -= chunk_size; @@ -171,15 +173,15 @@ public: if (channels || sample_rate || bytes_per_sample) throw AudioProviderError("Multiple 'fmt ' chunks not supported"); - auto compression = *Read(&chunk_size); + auto compression = Read(&chunk_size); if (compression != 1) throw AudioProviderError("File is not uncompressed PCM"); - channels = *Read(&chunk_size); - sample_rate = *Read(&chunk_size); + channels = Read(&chunk_size); + sample_rate = Read(&chunk_size); Read(&chunk_size); // Average bytes per sample; meaningless Read(&chunk_size); // Block align - bytes_per_sample = (*Read(&chunk_size) + 7) / 8; + bytes_per_sample = (Read(&chunk_size) + 7) / 8; } else if (chunk_fcc == Impl::data_id()) { if (!channels || !sample_rate || !bytes_per_sample)