Fix slightly unbelievable out-of-bounds array access when setting up the audio map...
authorCarl Hetherington <cth@carlh.net>
Sat, 25 May 2019 23:30:28 +0000 (23:30 +0000)
committerCarl Hetherington <cth@carlh.net>
Fri, 31 May 2019 21:41:21 +0000 (22:41 +0100)
Forward-ported from 677eaab5c03e9c614ae2bc417a43bd5c1295bb8d in master.

src/lib/audio_mapping.cc
src/wx/film_viewer.cc

index 86add09f4cb4330cdcc039fb9d8477f83e8f4465..f07d5deced4a9f4e0f5c0a0115f0ecf4c5bfb3e5 100644 (file)
@@ -163,6 +163,8 @@ AudioMapping::AudioMapping (cxml::ConstNodePtr node, int state_version)
 void
 AudioMapping::set (int input_channel, int output_channel, float g)
 {
+       DCPOMATIC_ASSERT (input_channel < int(_gain.size()));
+       DCPOMATIC_ASSERT (output_channel < int(_gain[0].size()));
        _gain[input_channel][output_channel] = g;
 }
 
index 9623aef7991c8b7be129c04bde13bbc09b490cf8..a2b055934e9a1fdda844115f9628132172493006 100644 (file)
@@ -189,14 +189,26 @@ FilmViewer::recreate_butler ()
                   Map so that Lt = L(-3dB) + Ls(-3dB) + C(-6dB) + Lfe(-10dB)
                               Rt = R(-3dB) + Rs(-3dB) + C(-6dB) + Lfe(-10dB)
                */
-               map.set (dcp::LEFT,   0, 1 / sqrt(2)); // L -> Lt
-               map.set (dcp::RIGHT,  1, 1 / sqrt(2)); // R -> Rt
-               map.set (dcp::CENTRE, 0, 1 / 2.0); // C -> Lt
-               map.set (dcp::CENTRE, 1, 1 / 2.0); // C -> Rt
-               map.set (dcp::LFE,    0, 1 / sqrt(10)); // Lfe -> Lt
-               map.set (dcp::LFE,    1, 1 / sqrt(10)); // Lfe -> Rt
-               map.set (dcp::LS,     0, 1 / sqrt(2)); // Ls -> Lt
-               map.set (dcp::RS,     1, 1 / sqrt(2)); // Rs -> Rt
+               if (_film->audio_channels() > 0) {
+                       map.set (dcp::LEFT,   0, 1 / sqrt(2)); // L -> Lt
+               }
+               if (_film->audio_channels() > 1) {
+                       map.set (dcp::RIGHT,  1, 1 / sqrt(2)); // R -> Rt
+               }
+               if (_film->audio_channels() > 2) {
+                       map.set (dcp::CENTRE, 0, 1 / 2.0); // C -> Lt
+                       map.set (dcp::CENTRE, 1, 1 / 2.0); // C -> Rt
+               }
+               if (_film->audio_channels() > 3) {
+                       map.set (dcp::LFE,    0, 1 / sqrt(10)); // Lfe -> Lt
+                       map.set (dcp::LFE,    1, 1 / sqrt(10)); // Lfe -> Rt
+               }
+               if (_film->audio_channels() > 4) {
+                       map.set (dcp::LS,     0, 1 / sqrt(2)); // Ls -> Lt
+               }
+               if (_film->audio_channels() > 5) {
+                       map.set (dcp::RS,     1, 1 / sqrt(2)); // Rs -> Rt
+               }
        }
 
        _butler.reset (new Butler(_player, map, _audio_channels, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true));