Skip to content

Commit 66d5408

Browse files
laanwjMarcoFalke
authored andcommitted
Fix memleak in TorController [rework]
It looks like, TorController::disconnected_cb(TorControlConnection& conn) gets called multiple times which results in multiple event_new(). Avoid this by creating the event only once in the constructore, and deleting it only once in the destructor (thanks to Cory Fields for the idea). Replaces the fix by Jonas Schnelli in #7610, see discussion there. Github-Pull: #7637 Rebased-From: e219503
1 parent 1c3d38b commit 66d5408

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

src/torcontrol.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,9 @@ TorController::TorController(struct event_base* base, const std::string& target)
394394
target(target), conn(base), reconnect(true), reconnect_ev(0),
395395
reconnect_timeout(RECONNECT_TIMEOUT_START)
396396
{
397+
reconnect_ev = event_new(base, -1, 0, reconnect_cb, this);
398+
if (!reconnect_ev)
399+
LogPrintf("tor: Failed to create event for reconnection: out of memory?\n");
397400
// Start connection attempts immediately
398401
if (!conn.Connect(target, boost::bind(&TorController::connected_cb, this, _1),
399402
boost::bind(&TorController::disconnected_cb, this, _1) )) {
@@ -409,8 +412,10 @@ TorController::TorController(struct event_base* base, const std::string& target)
409412

410413
TorController::~TorController()
411414
{
412-
if (reconnect_ev)
413-
event_del(reconnect_ev);
415+
if (reconnect_ev) {
416+
event_free(reconnect_ev);
417+
reconnect_ev = 0;
418+
}
414419
if (service.IsValid()) {
415420
RemoveLocal(service);
416421
}
@@ -622,8 +627,8 @@ void TorController::disconnected_cb(TorControlConnection& conn)
622627

623628
// Single-shot timer for reconnect. Use exponential backoff.
624629
struct timeval time = MillisToTimeval(int64_t(reconnect_timeout * 1000.0));
625-
reconnect_ev = event_new(base, -1, 0, reconnect_cb, this);
626-
event_add(reconnect_ev, &time);
630+
if (reconnect_ev)
631+
event_add(reconnect_ev, &time);
627632
reconnect_timeout *= RECONNECT_TIMEOUT_EXP;
628633
}
629634

0 commit comments

Comments
 (0)