You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by GitBox <gi...@apache.org> on 2020/04/24 04:29:00 UTC

[GitHub] [pulsar] BewareMyPower commented on issue #6806: Segmentation fault in C++ library whilst deserializing messages

BewareMyPower commented on issue #6806:
URL: https://github.com/apache/pulsar/issues/6806#issuecomment-618794964


   The problem may be the strange value (538973717) of `readIdx_` 。Could you provide the `payload` info of each frame?
   
   Following is the lifetime of `payload` (if I don't miss something):
   
   The payload first constructed in `ClientConnection::processIncomingBuffer()`:
   
   ```c++
               SharedBuffer payload = SharedBuffer::copy(incomingBuffer_.data(), payloadSize);
               incomingBuffer_.consume(payloadSize);
               // payload.readIdx_ should be 0 here
               handleIncomingMessage(incomingCmd_.message(), isChecksumValid, msgMetadata, payload);
   ```
   
   Then it comes to `ClientConnection::handleIncomingMessage()`, `payload` was passed to `consumer->messageReceived()` without any changes.
   
   In `ConsumerImpl::messageReceived`, `payload` may be modified in `decryptMessageIfNeeded()` and `uncompressMessageIfNeeded()`, while the previous may do nothing if encryption was not enabled.
   
   Then the payload was passed to the constructor of `Message` as `m.impl_->payload`, and next `m` was passed to `receiveIndividualMessagesFromBatch`:
   
   ```c++
       Message m(msg, metadata, payload, partitionIndex_);
       m.impl_->cnx_ = cnx.get();
       m.impl_->setTopicName(topic_);
       m.impl_->setRedeliveryCount(msg.redelivery_count());
   
       unsigned int numOfMessageReceived = 1;
       if (metadata.has_num_messages_in_batch()) {
           Lock lock(mutex_);
           // m.impl_->payload.readIdx_ should be 0 here
           numOfMessageReceived = receiveIndividualMessagesFromBatch(cnx, m, msg.redelivery_count());
   ```
   
   And next:
   
   ```c++
   uint32_t ConsumerImpl::receiveIndividualMessagesFromBatch(const ClientConnectionPtr& cnx,
                                                             Message& batchedMessage, int redeliveryCount) {
       unsigned int batchSize = batchedMessage.impl_->metadata.num_messages_in_batch();
       batchAcknowledgementTracker_.receivedMessage(batchedMessage);   // it doesn't modify batchedMessage
   
       int skippedMessages = 0;
   
       for (int i = 0; i < batchSize; i++) {
           // Now, batchedMessage.impl_->payload.readIdx_ becomes 538973717
           Message msg = Commands::deSerializeSingleMessageInBatch(batchedMessage, i);
   ```
   


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org