From 01e9eaf3a62d5e32196b441caa59c451fa1364ea Mon Sep 17 00:00:00 2001 From: George Joseph Date: Tue, 4 Apr 2017 15:20:22 -0600 Subject: pjproject_bundled: Add 3 upstream patches 0035-r5572-svn-backport-dialog-transaction-deadlock.patch 0036-r5573-svn-backport-ua-pjsua-transaction-deadlock.patch 0037-r5576-svn-backport-session-timer-crash.patch Also removed the progress bar from wget download to stdout. ASTERISK-26905 #close Reported-by: Ross Beer Change-Id: I268fb3cf71a3bb24283ff0d24bd8b03239d81256 --- ...vn-backport-ua-pjsua-transaction-deadlock.patch | 119 +++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 third-party/pjproject/patches/0036-r5573-svn-backport-ua-pjsua-transaction-deadlock.patch (limited to 'third-party/pjproject/patches/0036-r5573-svn-backport-ua-pjsua-transaction-deadlock.patch') diff --git a/third-party/pjproject/patches/0036-r5573-svn-backport-ua-pjsua-transaction-deadlock.patch b/third-party/pjproject/patches/0036-r5573-svn-backport-ua-pjsua-transaction-deadlock.patch new file mode 100644 index 000000000..5887380da --- /dev/null +++ b/third-party/pjproject/patches/0036-r5573-svn-backport-ua-pjsua-transaction-deadlock.patch @@ -0,0 +1,119 @@ +Index: trunk/pjsip/include/pjsip/sip_transaction.h +=================================================================== +--- a/pjsip/include/pjsip/sip_transaction.h (revision 5572) ++++ b/pjsip/include/pjsip/sip_transaction.h (revision 5573) +@@ -180,4 +180,8 @@ + * is created by calling #pjsip_tsx_create_key() from an incoming message. + * ++ * IMPORTANT: To prevent deadlock, application should use ++ * #pjsip_tsx_layer_find_tsx2() instead which only adds a reference to ++ * the transaction instead of locking it. ++ * + * @param key The key string to find the transaction. + * @param lock If non-zero, transaction will be locked before the +@@ -190,4 +194,19 @@ + PJ_DECL(pjsip_transaction*) pjsip_tsx_layer_find_tsx( const pj_str_t *key, + pj_bool_t lock ); ++ ++/** ++ * Find a transaction with the specified key. The transaction key normally ++ * is created by calling #pjsip_tsx_create_key() from an incoming message. ++ * ++ * @param key The key string to find the transaction. ++ * @param add_ref If non-zero, transaction's reference will be added ++ * by one before the function returns, to make sure that ++ * it's not deleted by other threads. ++ * ++ * @return The matching transaction instance, or NULL if transaction ++ * can not be found. ++ */ ++PJ_DECL(pjsip_transaction*) pjsip_tsx_layer_find_tsx2( const pj_str_t *key, ++ pj_bool_t add_ref ); + + /** +Index: trunk/pjsip/src/pjsip/sip_transaction.c +=================================================================== +--- a/pjsip/src/pjsip/sip_transaction.c (revision 5572) ++++ b/pjsip/src/pjsip/sip_transaction.c (revision 5573) +@@ -642,6 +642,6 @@ + * Find a transaction. + */ +-PJ_DEF(pjsip_transaction*) pjsip_tsx_layer_find_tsx( const pj_str_t *key, +- pj_bool_t lock ) ++static pjsip_transaction* find_tsx( const pj_str_t *key, pj_bool_t lock, ++ pj_bool_t add_ref ) + { + pjsip_transaction *tsx; +@@ -655,5 +655,5 @@ + /* Prevent the transaction to get deleted before we have chance to lock it. + */ +- if (tsx && lock) ++ if (tsx) + pj_grp_lock_add_ref(tsx->grp_lock); + +@@ -667,10 +667,27 @@ + PJ_RACE_ME(5); + +- if (tsx && lock) { +- pj_grp_lock_acquire(tsx->grp_lock); +- pj_grp_lock_dec_ref(tsx->grp_lock); ++ if (tsx) { ++ if (lock) ++ pj_grp_lock_acquire(tsx->grp_lock); ++ ++ if (!add_ref) ++ pj_grp_lock_dec_ref(tsx->grp_lock); + } + + return tsx; ++} ++ ++ ++PJ_DEF(pjsip_transaction*) pjsip_tsx_layer_find_tsx( const pj_str_t *key, ++ pj_bool_t lock ) ++{ ++ return find_tsx(key, lock, PJ_FALSE); ++} ++ ++ ++PJ_DEF(pjsip_transaction*) pjsip_tsx_layer_find_tsx2( const pj_str_t *key, ++ pj_bool_t add_ref ) ++{ ++ return find_tsx(key, PJ_FALSE, add_ref); + } + +Index: trunk/pjsip/src/pjsip/sip_ua_layer.c +=================================================================== +--- a/pjsip/src/pjsip/sip_ua_layer.c (revision 5572) ++++ b/pjsip/src/pjsip/sip_ua_layer.c (revision 5573) +@@ -552,10 +552,10 @@ + + /* Lookup the INVITE transaction */ +- tsx = pjsip_tsx_layer_find_tsx(&key, PJ_TRUE); ++ tsx = pjsip_tsx_layer_find_tsx2(&key, PJ_TRUE); + + /* We should find the dialog attached to the INVITE transaction */ + if (tsx) { + dlg = (pjsip_dialog*) tsx->mod_data[mod_ua.mod.id]; +- pj_grp_lock_release(tsx->grp_lock); ++ pj_grp_lock_dec_ref(tsx->grp_lock); + + /* Dlg may be NULL on some extreme condition +Index: trunk/pjsip/src/pjsip-ua/sip_inv.c +=================================================================== +--- a/pjsip/src/pjsip-ua/sip_inv.c (revision 5572) ++++ b/pjsip/src/pjsip-ua/sip_inv.c (revision 5573) +@@ -3276,5 +3276,5 @@ + pjsip_tsx_create_key(rdata->tp_info.pool, &key, PJSIP_ROLE_UAS, + pjsip_get_invite_method(), rdata); +- invite_tsx = pjsip_tsx_layer_find_tsx(&key, PJ_TRUE); ++ invite_tsx = pjsip_tsx_layer_find_tsx2(&key, PJ_TRUE); + + if (invite_tsx == NULL) { +@@ -3325,5 +3325,5 @@ + + if (invite_tsx) +- pj_grp_lock_release(invite_tsx->grp_lock); ++ pj_grp_lock_dec_ref(invite_tsx->grp_lock); + } + -- cgit v1.2.3