Merge "res_pjsip_pubsub: Ensure dialog lock balance." into 13

changes/33/1533/1
Matt Jordan 10 years ago committed by Gerrit Code Review
commit 131c3c181d

@ -2134,19 +2134,20 @@ static int send_notify(struct sip_subscription_tree *sub_tree, unsigned int forc
static int serialized_send_notify(void *userdata) static int serialized_send_notify(void *userdata)
{ {
struct sip_subscription_tree *sub_tree = userdata; struct sip_subscription_tree *sub_tree = userdata;
pjsip_dialog *dlg = sub_tree->dlg;
if (!sub_tree->dlg) { if (!dlg) {
return 0; return 0;
} }
pjsip_dlg_inc_lock(sub_tree->dlg); pjsip_dlg_inc_lock(dlg);
/* It's possible that between when the notification was scheduled /* It's possible that between when the notification was scheduled
* and now, that a new SUBSCRIBE arrived, requiring full state to be * and now, that a new SUBSCRIBE arrived, requiring full state to be
* sent out in an immediate NOTIFY. If that has happened, we need to * sent out in an immediate NOTIFY. If that has happened, we need to
* bail out here instead of sending the batched NOTIFY. * bail out here instead of sending the batched NOTIFY.
*/ */
if (!sub_tree->send_scheduled_notify) { if (!sub_tree->send_scheduled_notify) {
pjsip_dlg_dec_lock(sub_tree->dlg); pjsip_dlg_dec_lock(dlg);
ao2_cleanup(sub_tree); ao2_cleanup(sub_tree);
return 0; return 0;
} }
@ -2156,7 +2157,7 @@ static int serialized_send_notify(void *userdata)
"Resource: %s", "Resource: %s",
sub_tree->root->resource); sub_tree->root->resource);
sub_tree->notify_sched_id = -1; sub_tree->notify_sched_id = -1;
pjsip_dlg_dec_lock(sub_tree->dlg); pjsip_dlg_dec_lock(dlg);
ao2_cleanup(sub_tree); ao2_cleanup(sub_tree);
return 0; return 0;
} }
@ -2190,21 +2191,22 @@ int ast_sip_subscription_notify(struct ast_sip_subscription *sub, struct ast_sip
int terminate) int terminate)
{ {
int res; int res;
pjsip_dialog *dlg = sub->tree->dlg;
if (!sub->tree->dlg) { if (!dlg) {
return 0; return 0;
} }
pjsip_dlg_inc_lock(sub->tree->dlg); pjsip_dlg_inc_lock(dlg);
if (!sub->tree->evsub) { if (!sub->tree->evsub) {
pjsip_dlg_dec_lock(sub->tree->dlg); pjsip_dlg_dec_lock(dlg);
return 0; return 0;
} }
if (ast_sip_pubsub_generate_body_content(ast_sip_subscription_get_body_type(sub), if (ast_sip_pubsub_generate_body_content(ast_sip_subscription_get_body_type(sub),
ast_sip_subscription_get_body_subtype(sub), notify_data, &sub->body_text)) { ast_sip_subscription_get_body_subtype(sub), notify_data, &sub->body_text)) {
pjsip_dlg_dec_lock(sub->tree->dlg); pjsip_dlg_dec_lock(dlg);
return -1; return -1;
} }
@ -2225,7 +2227,7 @@ int ast_sip_subscription_notify(struct ast_sip_subscription *sub, struct ast_sip
ao2_ref(sub->tree, -1); ao2_ref(sub->tree, -1);
} }
pjsip_dlg_dec_lock(sub->tree->dlg); pjsip_dlg_dec_lock(dlg);
return res; return res;
} }
@ -3195,14 +3197,15 @@ static void set_state_terminated(struct ast_sip_subscription *sub)
static int serialized_pubsub_on_server_timeout(void *userdata) static int serialized_pubsub_on_server_timeout(void *userdata)
{ {
struct sip_subscription_tree *sub_tree = userdata; struct sip_subscription_tree *sub_tree = userdata;
pjsip_dialog *dlg = sub_tree->dlg;
if (!sub_tree->dlg) { if (!dlg) {
return 0; return 0;
} }
pjsip_dlg_inc_lock(sub_tree->dlg); pjsip_dlg_inc_lock(dlg);
if (!sub_tree->evsub) { if (!sub_tree->evsub) {
pjsip_dlg_dec_lock(sub_tree->dlg); pjsip_dlg_dec_lock(dlg);
return 0; return 0;
} }
set_state_terminated(sub_tree->root); set_state_terminated(sub_tree->root);
@ -3211,7 +3214,7 @@ static int serialized_pubsub_on_server_timeout(void *userdata)
"Resource: %s", "Resource: %s",
sub_tree->root->resource); sub_tree->root->resource);
pjsip_dlg_dec_lock(sub_tree->dlg); pjsip_dlg_dec_lock(dlg);
ao2_cleanup(sub_tree); ao2_cleanup(sub_tree);
return 0; return 0;
} }
@ -3299,14 +3302,15 @@ static void pubsub_on_evsub_state(pjsip_evsub *evsub, pjsip_event *event)
static int serialized_pubsub_on_rx_refresh(void *userdata) static int serialized_pubsub_on_rx_refresh(void *userdata)
{ {
struct sip_subscription_tree *sub_tree = userdata; struct sip_subscription_tree *sub_tree = userdata;
pjsip_dialog *dlg = sub_tree->dlg;
if (!sub_tree->dlg) { if (!dlg) {
return 0; return 0;
} }
pjsip_dlg_inc_lock(sub_tree->dlg); pjsip_dlg_inc_lock(dlg);
if (!sub_tree->evsub) { if (!sub_tree->evsub) {
pjsip_dlg_dec_lock(sub_tree->dlg); pjsip_dlg_dec_lock(dlg);
return 0; return 0;
} }
@ -3320,7 +3324,7 @@ static int serialized_pubsub_on_rx_refresh(void *userdata)
"SUBSCRIPTION_TERMINATED" : "SUBSCRIPTION_REFRESHED", "SUBSCRIPTION_TERMINATED" : "SUBSCRIPTION_REFRESHED",
"Resource: %s", sub_tree->root->resource); "Resource: %s", sub_tree->root->resource);
pjsip_dlg_dec_lock(sub_tree->dlg); pjsip_dlg_dec_lock(dlg);
ao2_cleanup(sub_tree); ao2_cleanup(sub_tree);
return 0; return 0;
} }

Loading…
Cancel
Save