java-topology/defects/tiled-0001/patch/tiled-0001.patch
russell@unturf.com 191f018d78 undf: assign 949-951; tiled map editor 3 CWE-407 defects
tiled-0001: mapdocument.cpp sortObjects/sortLayers/moveLayersUp/Down/duplicate
  QList.contains() inside iteration over all map layers/objects = O(N*S)
  Fix: QSet O(1) lookup. MEDIUM severity. 24x speedup at N=2000,S=1000.

tiled-0002: mapobjectmodel.cpp classChanged
  QList.contains(tile) inside nested loop over all map objects = O(O*T)
  Fix: QSet O(1) lookup. MEDIUM severity. 14x speedup at O=2000,T=500.

tiled-0003: editpolygontool.cpp updateHandles
  QList.contains() inside QHash iteration = O(H*S)
  Fix: QSet O(1) lookup. MEDIUM severity. 13x speedup at H=1000,S=500.

3/3 PASS. MOAD-0002/0003/0004/0005 CLEAN.
2026-03-31 11:44:37 -04:00

70 lines
2.7 KiB
Diff

# UNDF: UNDF-2026-000000949
--- a/src/tiled/mapdocument.cpp
+++ b/src/tiled/mapdocument.cpp
@@ -1225,6 +1225,9 @@ static QList<Layer *> sortLayers(const Map &map, const QList<Layer *> &layers)
if (layers.size() < 2)
return layers;
+ const QSet<Layer *> layerSet(layers.begin(), layers.end());
+
QList<Layer *> sorted;
sorted.reserve(layers.size());
LayerIterator iterator(&map);
while (Layer *layer = iterator.next()) {
- if (layers.contains(layer))
+ if (layerSet.contains(layer))
sorted.append(layer);
}
@@ -1247,6 +1250,9 @@ static QList<MapObject *> sortObjects(const Map &map, const QList<MapObject *> &
if (objects.size() < 2)
return objects;
+ const QSet<MapObject *> objectSet(objects.begin(), objects.end());
+
QList<MapObject *> sorted;
sorted.reserve(objects.size());
LayerIterator iterator(&map);
while (Layer *layer = iterator.next()) {
if (layer->layerType() != Layer::ObjectGroupType)
continue;
for (MapObject *mapObject : static_cast<ObjectGroup*>(layer)->objects()) {
- if (objects.contains(mapObject))
+ if (objectSet.contains(mapObject))
sorted.append(mapObject);
}
}
@@ -686,7 +686,8 @@ void MapDocument::duplicateLayers(const QList<Layer *> &layers)
// Duplicate layers in the right order (groups before their children)
+ const QSet<Layer *> layerSet(layers.begin(), layers.end());
LayerIterator iterator(mMap.get());
iterator.toBack();
while (Layer *layer = iterator.previous())
- if (layers.contains(layer))
+ if (layerSet.contains(layer))
layersToDuplicate.append(layer);
@@ -808,7 +809,8 @@ void MapDocument::moveLayersUp(const QList<Layer *> &layers)
// Move layers in the right order, and abort if one of the layers can't be
// moved (iterating backwards because when moving layers up we need to
// start moving the top-most layer first)
+ const QSet<Layer *> layerSet(layers.begin(), layers.end());
LayerIterator iterator(mMap.get());
iterator.toBack();
while (Layer *layer = iterator.previous()) {
- if (layers.contains(layer)) {
+ if (layerSet.contains(layer)) {
if (!MoveLayer::canMoveUp(*layer))
return;
@@ -837,6 +839,7 @@ void MapDocument::moveLayersDown(const QList<Layer *> &layers)
// Move layers in the right order, and abort if one of the layers can't be moved
+ const QSet<Layer *> layerSet(layers.begin(), layers.end());
for (Layer *layer : mMap->allLayers()) {
- if (layers.contains(layer)) {
+ if (layerSet.contains(layer)) {
if (!MoveLayer::canMoveDown(*layer))
return;