java-topology/defects/cocos2d-0001/patch/cocos2d-0001.patch
russell@unturf.com 1b98cac200 cocos2d-x: 3 CWE-407 defects, MOAD 0002-0005 CLEAN
cocos2d-0001: EventDispatcher _toRemovedListeners std::find O(L*R) MEDIUM 2.4x
cocos2d-0002: PhysicsWorld collisionBeginCallback std::find O(J_body*J_world) MEDIUM 11.6x
cocos2d-0003: BoneNode::visit _boneSkins.contains O(C*S) per frame MEDIUM 7.3x

MOAD-0002 (Intertangle): heavy singleton pattern (Director, etc.) but architectural, not patchable
MOAD-0003 (Leaked Context): no thread_local usage, CLEAN
MOAD-0004 (Logged Secret): no credential logging, CLEAN
MOAD-0005 (Thundering Herd): TextureCache uses unordered_map, CLEAN

6/6 unit tests PASS.
2026-03-31 12:10:19 -04:00

72 lines
3 KiB
Diff

# UNDF: UNDF-2026-000000960
--- a/cocos/base/CCEventDispatcher.h
+++ b/cocos/base/CCEventDispatcher.h
@@ -29,6 +29,7 @@
#include <string>
#include <unordered_map>
+#include <unordered_set>
#include <vector>
#include <set>
@@ -335,7 +336,7 @@
std::vector<EventListener*> _toAddedListeners;
/** The listeners to be removed after dispatching event */
- std::vector<EventListener*> _toRemovedListeners;
+ std::unordered_set<EventListener*> _toRemovedListeners;
/** The nodes were associated with scene graph based priority listeners */
std::set<Node*> _dirtyNodes;
--- a/cocos/base/CCEventDispatcher.cpp
+++ b/cocos/base/CCEventDispatcher.cpp
@@ -607,8 +607,7 @@ void EventDispatcher::removeEventListener(EventListener* listener)
return;
// just return if listener is in _toRemovedListeners to avoid remove listeners more than once
- if (std::find(_toRemovedListeners.begin(), _toRemovedListeners.end(), listener) != _toRemovedListeners.end())
+ if (_toRemovedListeners.count(listener) > 0)
return;
bool isFound = false;
@@ -636,7 +635,7 @@ void EventDispatcher::removeEventListener(EventListener* listener)
}
else
{
- _toRemovedListeners.push_back(l);
+ _toRemovedListeners.insert(l);
}
isFound = true;
@@ -1171,9 +1170,8 @@ void EventDispatcher::updateListeners(Event* event)
{
iter = sceneGraphPriorityListeners->erase(iter);
// if item in toRemove list, remove it from the list
- auto matchIter = std::find(_toRemovedListeners.begin(), _toRemovedListeners.end(), l);
- if (matchIter != _toRemovedListeners.end())
- _toRemovedListeners.erase(matchIter);
+ if (_toRemovedListeners.count(l) > 0)
+ _toRemovedListeners.erase(l);
releaseListener(l);
}
else
@@ -1192,9 +1190,8 @@ void EventDispatcher::updateListeners(Event* event)
{
iter = fixedPriorityListeners->erase(iter);
// if item in toRemove list, remove it from the list
- auto matchIter = std::find(_toRemovedListeners.begin(), _toRemovedListeners.end(), l);
- if (matchIter != _toRemovedListeners.end())
- _toRemovedListeners.erase(matchIter);
+ if (_toRemovedListeners.count(l) > 0)
+ _toRemovedListeners.erase(l);
releaseListener(l);
}
else
@@ -1560,7 +1557,7 @@ void EventDispatcher::cleanToRemovedListeners()
{
for (auto& l : _toRemovedListeners)
{
- auto listenersIter = _listenerMap.find(l->getListenerID());
+ auto listenersIter = _listenerMap.find(l->getListenerID());
if (listenersIter == _listenerMap.end())
{
releaseListener(l);