diff options
author | Richard Mudgett <rmudgett@digium.com> | 2011-10-11 19:28:23 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2011-10-11 19:28:23 +0000 |
commit | b63c1cc5456fb9f0a28fc4d99c46075334102280 (patch) | |
tree | 1f76c1f09cab84ff18d3b1220d7cc0bf923154db /channels/sip/include | |
parent | 1ec8a9d896e9ce2da8ab38d64c2a9b36707145d5 (diff) |
Fix some potential deadlocks pointed out by helgrind.
* Fixed deadlock potential calling dialog_unlink_all() in
__sip_autodestruct(). Found by helgrind.
* Fixed deadlock potential in handle_request_invite() after calling
sip_new(). Found by helgrind.
* The sip_new() function now returns with the created channel already
locked.
* Removed the dead code that starts a PBX in in sip_new(). No sip_new()
callers caused that code to be executed and it was a bad thing to do
anyway.
* Removed unused parameters and return value from dialog_unlink_all().
* Made dialog_unlink_all() and __sip_autodestruct() safely obtain the
owner and private channel locks without a deadlock avoidance loop.
........
Merged revisions 340284 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 340310 from http://svn.asterisk.org/svn/asterisk/branches/10
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@340318 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/sip/include')
-rw-r--r-- | channels/sip/include/dialog.h | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/channels/sip/include/dialog.h b/channels/sip/include/dialog.h index ed31b7774..d4024c068 100644 --- a/channels/sip/include/dialog.h +++ b/channels/sip/include/dialog.h @@ -57,10 +57,13 @@ void __sip_destroy(struct sip_pvt *p, int lockowner, int lockdialoglist); * \brief Unlink a dialog from the dialogs container, as well as any other places * that it may be currently stored. * - * \note A reference to the dialog must be held before calling this function, and this - * function does not release that reference. + * \note A reference to the dialog must be held before calling + * this function, and this function does not release that + * reference. + * + * \note The dialog must not be locked when called. */ -void *dialog_unlink_all(struct sip_pvt *dialog, int lockowner, int lockdialoglist); +void dialog_unlink_all(struct sip_pvt *dialog); /*! \brief Acknowledges receipt of a packet and stops retransmission * called with p locked*/ |