diff --git a/include/livekit/audio_frame.h b/include/livekit/audio_frame.h index cac5765f..c058cfce 100644 --- a/include/livekit/audio_frame.h +++ b/include/livekit/audio_frame.h @@ -43,8 +43,9 @@ class LIVEKIT_API AudioFrame { /// @param num_channels Number of channels. /// @param samples_per_channel Number of samples per channel. /// - /// @throws std::invalid_argument if the data size is inconsistent with - /// num_channels * samples_per_channel. + /// @throws std::invalid_argument if @p num_channels or + /// @p samples_per_channel is not positive, or if the data size is + /// inconsistent with num_channels * samples_per_channel. AudioFrame(std::vector data, int sample_rate, int num_channels, int samples_per_channel); AudioFrame(); // Default constructor virtual ~AudioFrame() = default; diff --git a/src/audio_frame.cpp b/src/audio_frame.cpp index e9770c03..956a36a4 100644 --- a/src/audio_frame.cpp +++ b/src/audio_frame.cpp @@ -35,7 +35,13 @@ AudioFrame::AudioFrame(std::vector data, int sample_rate, int num_ sample_rate_(sample_rate), num_channels_(num_channels), samples_per_channel_(samples_per_channel) { - const std::size_t expected = static_cast(num_channels_) * static_cast(samples_per_channel_); + if (num_channels_ <= 0 || samples_per_channel_ <= 0) { + throw std::invalid_argument("AudioFrame: num_channels and samples_per_channel must be positive"); + } + + const auto channels = static_cast(num_channels_); + const auto samples = static_cast(samples_per_channel_); + const std::size_t expected = channels * samples; if (data_.size() < expected) { throw std::invalid_argument("AudioFrame: data size must be >= num_channels * samples_per_channel"); diff --git a/src/tests/unit/test_audio_frame.cpp b/src/tests/unit/test_audio_frame.cpp index 312f0e61..67cdda3d 100644 --- a/src/tests/unit/test_audio_frame.cpp +++ b/src/tests/unit/test_audio_frame.cpp @@ -163,4 +163,13 @@ TEST_F(AudioFrameTest, InvalidDataSizeThrows) { EXPECT_THROW(AudioFrame(data, 48000, 2, 960), std::invalid_argument); } +TEST_F(AudioFrameTest, NonPositiveDimensionsThrow) { + const std::vector data; + + EXPECT_THROW(AudioFrame(data, 48000, 0, 960), std::invalid_argument); + EXPECT_THROW(AudioFrame(data, 48000, 2, 0), std::invalid_argument); + EXPECT_THROW(AudioFrame(data, 48000, -1, 960), std::invalid_argument); + EXPECT_THROW(AudioFrame(data, 48000, 2, -1), std::invalid_argument); +} + } // namespace livekit::test