From 529d56ed9cc0b8399df79af40bea44431fc1def5 Mon Sep 17 00:00:00 2001
From: Cosmic Linden <cosmic@lindenlab.com>
Date: Fri, 19 Jan 2024 17:09:11 -0800
Subject: [PATCH] SL-20606: Fix cached probe flags for material preview
 potentially exceeding storage bounds

---
 indra/newview/llreflectionmapmanager.cpp | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index 84f6dd7a4f5..2b6985b214b 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -28,7 +28,7 @@
 
 #include "llreflectionmapmanager.h"
 
-#include <bitset>
+#include <vector>
 
 #include "llviewercamera.h"
 #include "llspatialpartition.h"
@@ -1389,14 +1389,16 @@ void LLReflectionMapManager::doOcclusion()
 
 void LLReflectionMapManager::forceDefaultProbeAndUpdateUniforms(bool force)
 {
-    static std::bitset<LL_MAX_REFLECTION_PROBE_COUNT> mProbeWasOccluded;
+    static std::vector<bool> mProbeWasOccluded;
 
     if (force)
     {
+        llassert(mProbeWasOccluded.empty());
+
         for (size_t i = 0; i < mProbes.size(); ++i)
         {
             auto& probe = mProbes[i];
-            mProbeWasOccluded[i] = probe->mOccluded;
+            mProbeWasOccluded.push_back(probe->mOccluded);
             if (probe != nullptr && probe != mDefaultProbe)
             {
                 probe->mOccluded = true;
@@ -1407,11 +1409,16 @@ void LLReflectionMapManager::forceDefaultProbeAndUpdateUniforms(bool force)
     }
     else
     {
-        for (size_t i = 0; i < mProbes.size(); ++i)
+        llassert(mProbes.size() == mProbeWasOccluded.size());
+
+        const size_t n = llmin(mProbes.size(), mProbeWasOccluded.size());
+        for (size_t i = 0; i < n; ++i)
         {
             auto& probe = mProbes[i];
             llassert(probe->mOccluded == (probe != mDefaultProbe));
             probe->mOccluded = mProbeWasOccluded[i];
         }
+        mProbeWasOccluded.clear();
+        mProbeWasOccluded.shrink_to_fit();
     }
 }
-- 
GitLab