From dae81f7bf5f7c28c66b091a0330b8b527293ede2 Mon Sep 17 00:00:00 2001 From: Fiona Sweet Date: Mon, 15 Jun 2026 12:53:52 -0700 Subject: [PATCH] Update AvatarFactoryModule.cs in logs i have noticed thousands of 'rebake' requests happening extremely rapidly from a few hg visitors, (for example yesterday 2400 from one hg visitor in 3 minutes) a potential denial of service vector. this adds throttling limit 1 per 30 seconds. please review --- .../AvatarFactory/AvatarFactoryModule.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 3dfa2eba10..89e89ce9c0 100755 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -67,6 +67,10 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory private object m_setAppearanceLock = new object(); + // add throttle + private ConcurrentDictionary m_rebakeThrottle = new ConcurrentDictionary(); + private const int REBAKE_THROTTLE_SECONDS = 30; + #region Region Module interface public void Initialise(IConfigSource config) @@ -451,10 +455,32 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory sp.Appearance.WearableCacheItems = wearableCache; + // throttle rebake requests + if (missing.Count > 0) { + long now = DateTime.UtcNow.Ticks; + foreach (UUID id in missing) + { + string key = sp.UUID.ToString() + ":" + id.ToString(); + + long last; + if (m_rebakeThrottle.TryGetValue(key, out last)) + { + TimeSpan age = new TimeSpan(now - last); + if (age.TotalSeconds < REBAKE_THROTTLE_SECONDS) + continue; + } + + m_rebakeThrottle[key] = now; + + m_log.DebugFormat( + "[AVFACTORY]: Missing baked texture {0} for {1}, requesting rebake", + id, sp.Name); + sp.ControllingClient.SendRebakeAvatarTextures(id); + } } bool changed = false;