Add some safety checks when reading from data sources.

This commit is contained in:
David Reid
2021-01-13 22:44:08 +10:00
parent 7a8ff122bc
commit 63df16a2df
3 changed files with 23 additions and 1 deletions
+7
View File
@@ -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().
+1 -1
View File
@@ -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);
+15
View File
@@ -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;
}