From 8444c335149dcbb909156e44dcda7b1bc2ea4bee Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 8 Jun 2019 11:51:15 +0200 Subject: [PATCH] output/osx: don't use variable-length arrays --- src/output/plugins/OSXOutputPlugin.cxx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/output/plugins/OSXOutputPlugin.cxx b/src/output/plugins/OSXOutputPlugin.cxx index 775e3f993..c283c9050 100644 --- a/src/output/plugins/OSXOutputPlugin.cxx +++ b/src/output/plugins/OSXOutputPlugin.cxx @@ -397,8 +397,12 @@ osx_output_set_device_format(AudioDeviceID dev_id, if (err != noErr) throw FormatRuntimeError("Cannot get number of streams: %d\n", err); - int n_streams = property_size / sizeof(AudioStreamID); - AudioStreamID streams[n_streams]; + const size_t n_streams = property_size / sizeof(AudioStreamID); + static constexpr size_t MAX_STREAMS = 64; + if (n_streams > MAX_STREAMS) + throw std::runtime_error("Too many streams"); + + AudioStreamID streams[MAX_STREAMS]; err = AudioObjectGetPropertyData(dev_id, &aopa, 0, NULL, &property_size, streams); if (err != noErr) throw FormatRuntimeError("Cannot get streams: %d\n", err); @@ -407,7 +411,7 @@ osx_output_set_device_format(AudioDeviceID dev_id, int output_stream; AudioStreamBasicDescription output_format; - for (int i = 0; i < n_streams; i++) { + for (size_t i = 0; i < n_streams; i++) { UInt32 direction; AudioStreamID stream = streams[i]; aopa.mSelector = kAudioStreamPropertyDirection; @@ -433,7 +437,11 @@ osx_output_set_device_format(AudioDeviceID dev_id, streams[i], err); const size_t format_count = property_size / sizeof(AudioStreamRangedDescription); - AudioStreamRangedDescription format_list[format_count]; + static constexpr size_t MAX_FORMATS = 256; + if (format_count > MAX_FORMATS) + throw std::runtime_error("Too many formats"); + + AudioStreamRangedDescription format_list[MAX_FORMATS]; err = AudioObjectGetPropertyData(stream, &aopa, 0, NULL, &property_size, format_list); if (err != noErr) throw FormatRuntimeError("Unable to get available formats for stream %d. Error = %s",