diff --git a/src/models/processor.cpp b/src/models/processor.cpp index 0b64e8b049..361e8685f6 100644 --- a/src/models/processor.cpp +++ b/src/models/processor.cpp @@ -59,8 +59,11 @@ std::unique_ptr LoadAudiosFromBuffers(std::span audio_data, throw std::runtime_error("Number of audio data buffers does not match the number of audio data sizes"); std::vector sizes; - for (size_t i = 0; i < audio_data_sizes.size(); ++i) + for (size_t i = 0; i < audio_data_sizes.size(); ++i) { + if (audio_data_sizes[i] == 0) + throw std::runtime_error("Audio buffer " + std::to_string(i) + " is empty."); sizes.push_back(audio_data_sizes[i]); + } ort_extensions::OrtxObjectPtr audios; CheckResult(OrtxCreateRawAudios(audios.ToBeAssigned(), audio_data.data(), sizes.data(), audio_data.size())); diff --git a/test/c_api_tests.cpp b/test/c_api_tests.cpp index 338724878a..f15fc170e3 100644 --- a/test/c_api_tests.cpp +++ b/test/c_api_tests.cpp @@ -1816,3 +1816,19 @@ TEST(CAPITests, ParakeetTdtTranscribeLong) { auto transcription = RunParakeetTdt(PARAKEET_TDT_AUDIO_TEDLIUM); EXPECT_FALSE(transcription.empty()); } + +// Regression test for MSRC: malformed audio buffers smaller than the minimum valid +// audio header size must be rejected with an error, not cause a crash. +TEST(CAPITests, LoadAudiosFromBuffersRejectsEmptyBuffer) { + const void* data_ptr = nullptr; + size_t data_size = 0; + OgaAudios* audios = nullptr; + OgaResult* result = OgaLoadAudiosFromBuffers(&data_ptr, &data_size, 1, &audios); + + // Should return an error for empty buffers. + ASSERT_NE(result, nullptr); + EXPECT_NE(std::string(OgaResultGetError(result)).find("empty"), std::string::npos); + OgaDestroyResult(result); + // audios should not have been created + EXPECT_EQ(audios, nullptr); +}