This is an automated email from the ASF dual-hosted git repository.

zike pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/pulsar-client-cpp.git


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new a9f3ced  Fix segmentation fault during the destruction of ConsumerImpl 
(#121)
a9f3ced is described below

commit a9f3ced28eab40617f9833e15cd8c50923279a7a
Author: Yunze Xu <[email protected]>
AuthorDate: Tue Nov 22 19:01:07 2022 +0800

    Fix segmentation fault during the destruction of ConsumerImpl (#121)
    
    ### Motivation
    
    When I ran the tests of Python wrapper in my local env, I observed a
    segmentation fault. See the key stacktrace:
    
    ```
    #3  0x00007ffff6d742c5 in std::unique_lock<std::mutex>::lock() () from 
/usr/local/lib/python3.8/dist-packages/_pulsar.cpython-38-x86_64-linux-gnu.so
    #4  0x00007ffff6d72523 in 
std::unique_lock<std::mutex>::unique_lock(std::mutex&) ()
       from 
/usr/local/lib/python3.8/dist-packages/_pulsar.cpython-38-x86_64-linux-gnu.so
    #5  0x00007ffff67de193 in pulsar::ClientImpl::newRequestId (this=0x0) at 
/home/xyz/github.com/apache/pulsar-client-cpp/lib/ClientImpl.cc:644
    #6  0x00007ffff685d2c2 in pulsar::ConsumerImpl::~ConsumerImpl 
(this=0x7fff9800f9e0, __in_chrg=<optimized out>)
        at /home/xyz/github.com/apache/pulsar-client-cpp/lib/ConsumerImpl.cc:116
    ```
    
    In the destructor of `ConsumerImpl`, `client->newRequestId` might be
    called. However, `client` might be a null pointer because it's returned
    by `std::weak_ptr::lock()`.
    
    ### Modifications
    
    Add null check to avoid the segfault.
---
 lib/ConsumerImpl.cc | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/lib/ConsumerImpl.cc b/lib/ConsumerImpl.cc
index c04a59e..41b13ae 100644
--- a/lib/ConsumerImpl.cc
+++ b/lib/ConsumerImpl.cc
@@ -127,11 +127,13 @@ ConsumerImpl::~ConsumerImpl() {
 
         ClientConnectionPtr cnx = getCnx().lock();
         ClientImplPtr client = client_.lock();
-        int requestId = client->newRequestId();
-        if (cnx) {
+        if (client && cnx) {
+            int requestId = client->newRequestId();
             cnx->sendRequestWithId(Commands::newCloseConsumer(consumerId_, 
requestId), requestId);
             cnx->removeConsumer(consumerId_);
             LOG_INFO(getName() << "Closed consumer for race condition: " << 
consumerId_);
+        } else {
+            LOG_WARN(getName() << "Client is destroyed and cannot send the 
CloseConsumer command");
         }
     }
     shutdown();

Reply via email to