res_pjsip_transport_websocket: Fix use-after-free bugs.
authorIvan Poddubny <ivan.poddubny@gmail.com>
Sun, 31 May 2015 17:37:40 +0000 (20:37 +0300)
committerIvan Poddubny <ivan.poddubny@gmail.com>
Wed, 10 Jun 2015 14:00:39 +0000 (17:00 +0300)
commit07f5f45e5a3282a2c046dfb3465df55f0d505225
treeebad099fb1aa3d3fe03b03f4f017a2659f505663
parent8785d0ccbfa1959d1ba6be8769e9d5356f3fef32
res_pjsip_transport_websocket: Fix use-after-free bugs.

This patch fixes use-after-free bugs caught by AddressSanitizer.

1. PJSIP transport manager may decide to destroy transport on its own.
For example, when the contact registered via websocket has not renewed
its registration in time. The transport was destoyed, but the websocket
listener thread was still active until the socket closes, and then tried
to call transport_shutdown on transport that has been freed.

Also, the transport destructor accessed wstransport->rdata.tp_info.pool
right after freeing memory that contained wstransport itself.

This patch converts transport to an ao2 object, allowing it to be
refcounted, so that it is available until both websocket listener and
pjsip transport manager are finished with it.

2. The websocket listener deletes the last reference on websocket session
when the tcp connection is closed, and it gets destroyed, but
the transport manager may still use it, for example when disconnect
happens in the middle of a SIP transaction.

A new reference to websocket session has been added that is released
with the transport to prevent this.

ASTERISK-25096 #close
Reported by: Josh Kitchens

ASTERISK-24963 #close
Reported by: Badalian Vyacheslav

Change-Id: Idc0b63eb6e459c1ddfb2430127d34b3c4d8d373b
res/res_pjsip_transport_websocket.c