[reSIProcate] resiprocate crash or dead lock when first subscribe has expires set to 0

Scott Godin sgodin at sipspectrum.com
Fri Jan 17 08:42:30 CST 2014


Looking at the dispatch method in ServerSubscription I can see that DUM
will send a 200 to the Subscribe request and a Notify with the subscription
state as terminated when receiving a Subscribe request with an Expires of
0.  Looks like you trying to do the same thing in the onNewSubscription
callback is causing issues.

I see a couple ways to tackle this:
1.  Use your workaround by not sending a notify in on onNewSubscription if
Expires is 0 - knowing that DUM will do it for you.
2.  If you need a body in the notify that goes out in this case - look for
Expires of 0 in onNewSubscription and try using update - then doing nothing
with the returned message.  I think this will cause the body to go out in
the notify message generated by DUM.
3.  We could add a check in the code in dispatch for the Expires = 0 case
to check if the application case called accept or sent a notify - then
avoid having DUM do it as well.

I don't believe anything has changed since 1.8.11 for this, so this problem
would also exist in SVN head.

Regards,
Scott


On Fri, Jan 17, 2014 at 8:19 AM, Ionut Slaveanu <islaveanu at ezuce.com> wrote:

> Hi,
> We are using resiprocate library 1.8.11-1 from fedora 19 updates to build
> an rls server.
> We have set callbacks for:
> -  resip::ServerSubscriptionHandler::onNewSubscription
> -  resip::ServerSubscriptionHandler::onTerminated
> -  resip::ServerSubscriptionHandler::onExpiredByClient
> and so on.
>
> I have noticed that if the first subscribe has expires set to 0 the server
> enter in a dead lock or even
> crashes.
> I have investigated this problem and it seems that if in onNewSubscription
> callback we send
> the full notify message after we are sending the 202 message, onTerminated
> callback is called before onExpiredByClient callback.
>
> The problem is that in ServerSubscription::send is:
>        DialogUsage::send(msg);
>       if (mSubscriptionState == Terminated)
>       {
>          handler->onTerminated(getHandle());
>          delete this;
>       }
>
> So resip::ServerSubscriptionHandle is deleted at this moment and later on,
> when is passed to
> onExpiredByClient callback it dead lock or even crashes the application
> because it points to invalid memory.
>
> My hack to avoid the crash was to change onNewSubscription callback to not
> send the notify message if the subscribe had expires set to 0.
>
> Do you know about this problem? Is this fixed in a new resiprocate version?
>
> Thank you!
> Ionut
>
>
>
>
> _______________________________________________
> 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/20140117/2bfc88de/attachment.htm>


More information about the resiprocate-devel mailing list