[reSIProcate] Question about TransactionState::handleSync() method

Scott Godin sgodin at sipspectrum.com
Thu Feb 18 13:24:05 CST 2016


I believe mNextTransmission is always expected to be valid during the send
process.  I think we need to understand how we got a DNS result and
mNextTransmission is not set.  Do you happen to have STACK or DEBUG level
logs of this occurring?

Thanks,
Scott

On Wed, Feb 17, 2016 at 3:53 AM, Dario Bozzali <Dario.Bozzali at ifmgroup.it>
wrote:

> Hi all,
>
> During a test with one of the lastest revision of reSIProcate library (Revision: b8111abeb6672cb00a42d45dfa734f8edfb04e99, Date: 09/11/2015) I encountered a strange crash in my application in TransactionState::handleSync() method.
>
> Crash occurred since mNextTransmission was equal to NULL while trying to assign value to mTarget.mTransportKey (please see excerpt of code reported below).
>
> It doesn't happen always. It occurred once and I'm still not able to reproduce always the issue, but I decided to write to you hoping that someone could help me to analyze this problem.
>
> In my opinion crash occurred on a Client transaction on receiving a retransmitted 200 OK, so on retransmitting ACK message.
>
> My doubt is the following one: Are we sure that mNextTransmission should be valid in handleSync()? In sendCurrentToWire() method we check if mNextTransmission is valid, so I was wondering if it should be better to check mNextTransmission also in handleSync() method.
>
> What is your opinion regarding this?
>
> Thank you in advance and best regards,
>
> Dario
>
>
>
>
>
> void
>
> TransactionState::handleSync(DnsResult* result)  // !slg! it is strange that we pass the result in here, then more or less ignore it in the method
>
> {
>
>    StackLog (<< *this << " got DNS result: " << *result);
>
>
>
>    // .bwc. Were we expecting something from mDnsResult?
>
>    if (mPendingOperation == Dns)
>
>    {
>
>       resip_assert(mDnsResult);
>
>       switch (mDnsResult->available())
>
>       {
>
>          case DnsResult::Available:
>
>             mPendingOperation=None;
>
>             mTarget = mDnsResult->next();
>
>             // below allows TU to know which transport we send on
>
>
> // (The Via mechanism for setting transport doesn't work for TLS)
>
>
>             mTarget.mTransportKey = mNextTransmission->getDestination().mTransportKey;
>
>             processReliability(mTarget.getType());
>
>             sendCurrentToWire();
>
>             break;
>
> ...
>
> }
>
>
>
> void
>
> TransactionState::sendCurrentToWire()
>
> {
>
>    if(!mMsgToRetransmit.empty())
>
>    {
>
>       if(mController.mStack.statisticsManagerEnabled())
>
>       {
>
>          mController.mStatsManager.retransmitted(mCurrentMethodType,
>
>                                                    isClient(),
>
>                                                    mCurrentResponseCode);
>
>       }
>
>        mController.mTransportSelector.retransmit(mMsgToRetransmit);
>
>    }
>
>    else if(mNextTransmission) // initial transmission; need to determine target
>
>    {
>
>       SipMessage* sip=mNextTransmission;
>
>       TransportSelector::TransmitState transmitState = TransportSelector::Unsent;
>
> ...
>
>       // !bwc! If we don't have DNS results yet, or TransportSelector::transmit
>
>       // fails, we hang on to the full original SipMessage, in the hope that
>
>       // next time it works.
>
>       if (transmitState == TransportSelector::Sent)
>
>       {
>
>          onSendSuccess();
>
>       }
>
>    }
>
>    else
>
>    {
>
>       resip_assert(0);
>
>    }
>
> }
>
>
>
> TransactionState::onSendSuccess()
>
> {
>
> ...
>
>    // !bwc! If mNextTransmission is a non-ACK request, we need to save the
>
>    // initial request in case we need to send a simulated 408 or a 503 to
>
>    // the TU (at least, until we get a response back)
>
>    if(!mNextTransmission->isRequest() || mNextTransmission->method()==ACK)
>
>    {
>
>       delete mNextTransmission;
>
>       mNextTransmission=0;
>
>    }
>
> }
>
>
>
> _______________________________________________
> resiprocate-devel mailing list
> resiprocate-devel at resiprocate.org
> https://list.resiprocate.org/mailman/listinfo/resiprocate-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.resiprocate.org/pipermail/resiprocate-devel/attachments/20160218/e1addd69/attachment.htm>


More information about the resiprocate-devel mailing list