From c8cfbadab930f6bda79adef71af8d3705483ccbe Mon Sep 17 00:00:00 2001 From: druidliu Date: Wed, 4 Feb 2026 11:54:15 +0800 Subject: [PATCH] Fix use-after-free crash in `getBrokerConsumerStatsAsync` when connection is closed. (#536) --- lib/MultiTopicsConsumerImpl.cc | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/MultiTopicsConsumerImpl.cc b/lib/MultiTopicsConsumerImpl.cc index 6e0ba86c..67611fe8 100644 --- a/lib/MultiTopicsConsumerImpl.cc +++ b/lib/MultiTopicsConsumerImpl.cc @@ -850,17 +850,17 @@ void MultiTopicsConsumerImpl::getBrokerConsumerStatsAsync(const BrokerConsumerSt LatchPtr latchPtr = std::make_shared(numberTopicPartitions_->load()); lock.unlock(); - size_t i = 0; - consumers_.forEachValue([this, &latchPtr, &statsPtr, &i, callback](const ConsumerImplPtr& consumer) { - size_t index = i++; - auto weakSelf = weak_from_this(); - consumer->getBrokerConsumerStatsAsync([this, weakSelf, latchPtr, statsPtr, index, callback]( - Result result, const BrokerConsumerStats& stats) { - auto self = weakSelf.lock(); - if (self) { - handleGetConsumerStats(result, stats, latchPtr, statsPtr, index, callback); - } - }); + auto indexPtr = std::make_shared>(0); + auto weakSelf = weak_from_this(); + consumers_.forEachValue([weakSelf, latchPtr, statsPtr, indexPtr, callback](const ConsumerImplPtr& consumer) { + size_t index = indexPtr->fetch_add(1); + consumer->getBrokerConsumerStatsAsync([weakSelf, latchPtr, statsPtr, index, callback]( + Result result, const BrokerConsumerStats& stats) { + auto self = weakSelf.lock(); + if (self) { + self->handleGetConsumerStats(result, stats, latchPtr, statsPtr, index, callback); + } + }); }); }