From 63df16a2df5fc506b983181f68b1e84788129f16 Mon Sep 17 00:00:00 2001 From: David Reid Date: Wed, 13 Jan 2021 22:44:08 +1000 Subject: [PATCH] Add some safety checks when reading from data sources. --- miniaudio.h | 7 +++++++ research/miniaudio_engine.c | 2 +- research/miniaudio_engine.h | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/miniaudio.h b/miniaudio.h index 6e07c6fa..b04a6a8f 100644 --- a/miniaudio.h +++ b/miniaudio.h @@ -43130,6 +43130,12 @@ MA_API ma_uint32 ma_get_bytes_per_sample(ma_format format) MA_API ma_result ma_data_source_read_pcm_frames(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead, ma_bool32 loop) { ma_data_source_callbacks* pCallbacks = (ma_data_source_callbacks*)pDataSource; + + /* Safety. */ + if (pFramesRead != NULL) { + *pFramesRead = 0; + } + if (pCallbacks == NULL) { return MA_INVALID_ARGS; } @@ -64686,6 +64692,7 @@ REVISION HISTORY ================ v0.10.31 - TBD - Make some functions const correct. + - Update ma_data_source_read_pcm_frames() to initialize pFramesRead to 0 for safety. v0.10.30 - 2021-01-10 - Fix a crash in ma_audio_buffer_read_pcm_frames(). diff --git a/research/miniaudio_engine.c b/research/miniaudio_engine.c index 1c0b73a0..9422838f 100644 --- a/research/miniaudio_engine.c +++ b/research/miniaudio_engine.c @@ -78,7 +78,7 @@ int main(int argc, char** argv) loadNotification.cb.onSignal = on_sound_loaded; loadNotification.pSound = &sound; - result = ma_sound_init_from_file(&engine, argv[1], MA_DATA_SOURCE_FLAG_DECODE | MA_DATA_SOURCE_FLAG_ASYNC /*| MA_DATA_SOURCE_FLAG_STREAM*/, &loadNotification, NULL, &sound); + result = ma_sound_init_from_file(&engine, argv[1], /*MA_DATA_SOURCE_FLAG_DECODE | MA_DATA_SOURCE_FLAG_ASYNC |*/ MA_DATA_SOURCE_FLAG_STREAM, &loadNotification, NULL, &sound); if (result != MA_SUCCESS) { printf("Failed to load sound: %s\n", argv[1]); ma_engine_uninit(&engine); diff --git a/research/miniaudio_engine.h b/research/miniaudio_engine.h index 84af2f5a..264ac7eb 100644 --- a/research/miniaudio_engine.h +++ b/research/miniaudio_engine.h @@ -5976,6 +5976,11 @@ MA_API ma_result ma_resource_manager_data_buffer_read_pcm_frames(ma_resource_man ma_bool32 isLooping; ma_bool32 skipBusyCheck = MA_FALSE; + /* Safety. */ + if (pFramesRead != NULL) { + *pFramesRead = 0; + } + /* We cannot be using the data buffer after it's been uninitialized. If you trigger this assert it means you're trying to read from the data buffer after it's been uninitialized or is in the process of uninitializing. @@ -6617,6 +6622,11 @@ MA_API ma_result ma_resource_manager_data_stream_read_pcm_frames(ma_resource_man ma_format format; ma_uint32 channels; + /* Safety. */ + if (pFramesRead != NULL) { + *pFramesRead = 0; + } + /* We cannot be using the data source after it's been uninitialized. */ MA_ASSERT(ma_resource_manager_data_stream_result(pDataStream) != MA_UNAVAILABLE); @@ -7031,6 +7041,11 @@ MA_API ma_result ma_resource_manager_data_source_uninit(ma_resource_manager_data MA_API ma_result ma_resource_manager_data_source_read_pcm_frames(ma_resource_manager_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) { + /* Safety. */ + if (pFramesRead != NULL) { + *pFramesRead = 0; + } + if (pDataSource == NULL) { return MA_INVALID_ARGS; }