Skip to content

Commit 26b39f1

Browse files
authored
Fix some reference counters (memleak) (#8981)
Fix some reference counters (memleak) Map::dispatchEvent: Allocation safety using references
1 parent d77ea76 commit 26b39f1

12 files changed

+30
-37
lines changed

src/client/fontengine.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,6 @@ void FontEngine::initFont(unsigned int basesize, FontMode mode)
275275
font_shadow_alpha);
276276

277277
if (font) {
278-
font->grab();
279278
m_font_cache[mode][basesize] = font;
280279
return;
281280
}
@@ -365,8 +364,6 @@ void FontEngine::initSimpleFont(unsigned int basesize, FontMode mode)
365364
}
366365
}
367366

368-
if (font) {
369-
font->grab();
367+
if (font)
370368
m_font_cache[mode][basesize] = font;
371-
}
372369
}

src/gui/guiFormSpecMenu.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,12 +1208,14 @@ void GUIFormSpecMenu::createTextField(parserData *data, FieldSpec &spec,
12081208
true, Environment, this, spec.fid, rect, is_editable, is_multiline);
12091209
e->drop();
12101210
} else {
1211-
if (is_multiline)
1211+
if (is_multiline) {
12121212
e = new GUIEditBoxWithScrollBar(spec.fdefault.c_str(), true,
12131213
Environment, this, spec.fid, rect, is_editable, true);
1214-
else if (is_editable)
1214+
e->drop();
1215+
} else if (is_editable) {
12151216
e = Environment->addEditBox(spec.fdefault.c_str(), rect, true,
12161217
this, spec.fid);
1218+
}
12171219
}
12181220

12191221
if (e) {

src/map.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ void Map::removeEventReceiver(MapEventReceiver *event_receiver)
8989
m_event_receivers.erase(event_receiver);
9090
}
9191

92-
void Map::dispatchEvent(MapEditEvent *event)
92+
void Map::dispatchEvent(const MapEditEvent &event)
9393
{
9494
for (MapEventReceiver *event_receiver : m_event_receivers) {
9595
event_receiver->onMapEditEvent(event);
@@ -274,7 +274,7 @@ bool Map::addNodeWithEvent(v3s16 p, MapNode n, bool remove_metadata)
274274
succeeded = false;
275275
}
276276

277-
dispatchEvent(&event);
277+
dispatchEvent(event);
278278

279279
return succeeded;
280280
}
@@ -299,7 +299,7 @@ bool Map::removeNodeWithEvent(v3s16 p)
299299
succeeded = false;
300300
}
301301

302-
dispatchEvent(&event);
302+
dispatchEvent(event);
303303

304304
return succeeded;
305305
}
@@ -2220,7 +2220,7 @@ MapBlock* ServerMap::loadBlock(v3s16 blockpos)
22202220
for (it = modified_blocks.begin();
22212221
it != modified_blocks.end(); ++it)
22222222
event.modified_blocks.insert(it->first);
2223-
dispatchEvent(&event);
2223+
dispatchEvent(event);
22242224
}
22252225
}
22262226
return block;

src/map.h

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,18 +79,7 @@ struct MapEditEvent
7979

8080
MapEditEvent() = default;
8181

82-
MapEditEvent * clone()
83-
{
84-
MapEditEvent *event = new MapEditEvent();
85-
event->type = type;
86-
event->p = p;
87-
event->n = n;
88-
event->modified_blocks = modified_blocks;
89-
event->is_private_change = is_private_change;
90-
return event;
91-
}
92-
93-
VoxelArea getArea()
82+
VoxelArea getArea() const
9483
{
9584
switch(type){
9685
case MEET_ADDNODE:
@@ -125,7 +114,7 @@ class MapEventReceiver
125114
{
126115
public:
127116
// event shall be deleted by caller after the call.
128-
virtual void onMapEditEvent(MapEditEvent *event) = 0;
117+
virtual void onMapEditEvent(const MapEditEvent &event) = 0;
129118
};
130119

131120
class Map /*: public NodeContainer*/
@@ -152,7 +141,7 @@ class Map /*: public NodeContainer*/
152141
void addEventReceiver(MapEventReceiver *event_receiver);
153142
void removeEventReceiver(MapEventReceiver *event_receiver);
154143
// event shall be deleted by caller after the call.
155-
void dispatchEvent(MapEditEvent *event);
144+
void dispatchEvent(const MapEditEvent &event);
156145

157146
// On failure returns NULL
158147
MapSector * getSectorNoGenerateNoLock(v2s16 p2d);

src/mapgen/mg_schematic.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ void Schematic::placeOnMap(ServerMap *map, v3s16 p, u32 flags,
246246
for (it = modified_blocks.begin(); it != modified_blocks.end(); ++it)
247247
event.modified_blocks.insert(it->first);
248248

249-
map->dispatchEvent(&event);
249+
map->dispatchEvent(event);
250250
}
251251

252252

src/mapgen/treegen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ treegen::error spawn_ltree(ServerEnvironment *env, v3s16 p0,
135135
event.type = MEET_OTHER;
136136
for (auto &modified_block : modified_blocks)
137137
event.modified_blocks.insert(modified_block.first);
138-
map->dispatchEvent(&event);
138+
map->dispatchEvent(event);
139139
return SUCCESS;
140140
}
141141

src/rollback_interface.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ bool RollbackAction::applyRevert(Map *map, InventoryManager *imgr, IGameDef *gam
176176
MapEditEvent event;
177177
event.type = MEET_BLOCK_NODE_METADATA_CHANGED;
178178
event.p = p;
179-
map->dispatchEvent(&event);
179+
map->dispatchEvent(event);
180180
} catch (InvalidPositionException &e) {
181181
infostream << "RollbackAction::applyRevert(): "
182182
<< "InvalidPositionException: " << e.what()

src/script/lua_api/l_env.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,7 @@ int ModApiEnvMod::l_fix_light(lua_State *L)
10351035
for (auto &modified_block : modified_blocks)
10361036
event.modified_blocks.insert(modified_block.first);
10371037

1038-
map.dispatchEvent(&event);
1038+
map.dispatchEvent(event);
10391039
}
10401040
lua_pushboolean(L, success);
10411041

@@ -1144,7 +1144,7 @@ int ModApiEnvMod::l_delete_area(lua_State *L)
11441144
}
11451145
}
11461146

1147-
map.dispatchEvent(&event);
1147+
map.dispatchEvent(event);
11481148
lua_pushboolean(L, success);
11491149
return 1;
11501150
}

src/script/lua_api/l_nodemeta.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ void NodeMetaRef::reportMetadataChange(const std::string *name)
6868
event.type = MEET_BLOCK_NODE_METADATA_CHANGED;
6969
event.p = m_p;
7070
event.is_private_change = name && meta && meta->isPrivate(*name);
71-
m_env->getMap().dispatchEvent(&event);
71+
m_env->getMap().dispatchEvent(event);
7272
}
7373

7474
// Exported functions

src/script/lua_api/l_vmanip.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ int LuaVoxelManip::l_write_to_map(lua_State *L)
126126
for (const auto &modified_block : o->modified_blocks)
127127
event.modified_blocks.insert(modified_block.first);
128128

129-
map->dispatchEvent(&event);
129+
map->dispatchEvent(event);
130130

131131
o->modified_blocks.clear();
132132
return 0;

src/server.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,11 @@ Server::~Server()
306306
for (auto &detached_inventory : m_detached_inventories) {
307307
delete detached_inventory.second;
308308
}
309+
310+
while (!m_unsent_map_edit_queue.empty()) {
311+
delete m_unsent_map_edit_queue.front();
312+
m_unsent_map_edit_queue.pop();
313+
}
309314
}
310315

311316
void Server::init()
@@ -1090,12 +1095,12 @@ void Server::setTimeOfDay(u32 time)
10901095
m_time_of_day_send_timer = 0;
10911096
}
10921097

1093-
void Server::onMapEditEvent(MapEditEvent *event)
1098+
void Server::onMapEditEvent(const MapEditEvent &event)
10941099
{
1095-
if (m_ignore_map_edit_events_area.contains(event->getArea()))
1100+
if (m_ignore_map_edit_events_area.contains(event.getArea()))
10961101
return;
1097-
MapEditEvent *e = event->clone();
1098-
m_unsent_map_edit_queue.push(e);
1102+
1103+
m_unsent_map_edit_queue.push(new MapEditEvent(event));
10991104
}
11001105

11011106
Inventory* Server::getInventory(const InventoryLocation &loc)
@@ -1160,7 +1165,7 @@ void Server::setInventoryModified(const InventoryLocation &loc)
11601165
MapEditEvent event;
11611166
event.type = MEET_BLOCK_NODE_METADATA_CHANGED;
11621167
event.p = loc.p;
1163-
m_env->getMap().dispatchEvent(&event);
1168+
m_env->getMap().dispatchEvent(event);
11641169
}
11651170
break;
11661171
case InventoryLocation::DETACHED:

src/server.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ class Server : public con::PeerHandler, public MapEventReceiver,
189189
This is accessed by the map, which is inside the environment,
190190
so it shouldn't be a problem.
191191
*/
192-
void onMapEditEvent(MapEditEvent *event);
192+
void onMapEditEvent(const MapEditEvent &event);
193193

194194
/*
195195
Shall be called with the environment and the connection locked.

0 commit comments

Comments
 (0)