[Asterisk-code-review] res stasis device state: Fix refcounting error. (asterisk[13])

Mark Michelson asteriskteam at digium.com
Thu Feb 4 12:05:46 CST 2016


Mark Michelson has uploaded a new change for review.

  https://gerrit.asterisk.org/2195

Change subject: res_stasis_device_state: Fix refcounting error.
......................................................................

res_stasis_device_state: Fix refcounting error.

Device state subscription lifetimes were governed by when the
subscription was established and unsubscribed from. However, it is
possible that at the time of unsubscription, there could be device state
events still in flight. When those device state events occur, the device
state callback could attempt to dereference a freed pointer. Crash.

This change ensures that the lifetime of the device state subscription
does not end until the underlying stasis subscription has confirmed that
its final message has been sent.

Change-Id: I25a0f1472894c1a562252fb7129671478e25e9b2
---
M res/res_stasis_device_state.c
1 file changed, 9 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/95/2195/1

diff --git a/res/res_stasis_device_state.c b/res/res_stasis_device_state.c
index c0b6859..be082dc 100644
--- a/res/res_stasis_device_state.c
+++ b/res/res_stasis_device_state.c
@@ -303,6 +303,12 @@
 {
 	struct ast_device_state_message *device_state;
 
+	if (stasis_subscription_final_message(sub, msg)) {
+		/* Remove stasis subscription's reference to device_state_subscription */
+		ao2_ref(data, -1);
+		return;
+	}
+
 	if (ast_device_state_message_type() != stasis_message_type(msg)) {
 		return;
 	}
@@ -365,10 +371,12 @@
 
 	ast_debug(3, "Subscribing to device %s\n", sub->device_name);
 
-	sub->sub = stasis_subscribe_pool(topic, device_state_cb, sub);
+	sub->sub = stasis_subscribe_pool(topic, device_state_cb, ao2_bump(sub));
 	if (!sub->sub) {
 		ast_log(LOG_ERROR, "Unable to subscribe to device %s\n",
 			sub->device_name);
+		/* Reference we added when attempting to stasis_subscribe_pool */
+		ao2_ref(sub, -1);
 		return -1;
 	}
 

-- 
To view, visit https://gerrit.asterisk.org/2195
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I25a0f1472894c1a562252fb7129671478e25e9b2
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: 13
Gerrit-Owner: Mark Michelson <mmichelson at digium.com>



More information about the asterisk-code-review mailing list