[Asterisk-code-review] Crash during "pjsip show channelstats" execution (...asterisk[master])

Friendly Automation asteriskteam at digium.com
Mon Oct 21 08:01:50 CDT 2019


Friendly Automation has submitted this change and it was merged. ( https://gerrit.asterisk.org/c/asterisk/+/13075 )

Change subject: Crash during "pjsip show channelstats" execution
......................................................................

Crash during "pjsip show channelstats" execution

During execution "pjsip show channelstats" cli command by an
external module asterisk crashed. It seems this is a separate
thread running to fetch and print rtp stats. The crash happened on
the ao2_lock method, just before it going to read the rtp stats on
a rtp instance. According to gdb backtrace log, it seems the
session media was already cleaned up at that moment.

ASTERISK-28578

Change-Id: I3e05980dd4694577be6d39be2c21a5736bae3c6f
---
M channels/pjsip/cli_commands.c
1 file changed, 6 insertions(+), 7 deletions(-)

Approvals:
  Joshua Colp: Looks good to me, but someone else must approve
  George Joseph: Looks good to me, approved
  Friendly Automation: Approved for Submit



diff --git a/channels/pjsip/cli_commands.c b/channels/pjsip/cli_commands.c
index 3250607..734b0e2 100644
--- a/channels/pjsip/cli_commands.c
+++ b/channels/pjsip/cli_commands.c
@@ -339,14 +339,14 @@
 	struct ast_sip_cli_context *context = arg;
 	const struct ast_channel_snapshot *snapshot = obj;
 	struct ast_channel *channel = ast_channel_get_by_name(snapshot->base->name);
-	struct ast_sip_channel_pvt *cpvt = channel ? ast_channel_tech_pvt(channel) : NULL;
+	struct ast_sip_channel_pvt *cpvt = NULL;
 	struct ast_sip_session *session;
 	struct ast_sip_session_media *media;
-	struct ast_rtp_instance *rtp;
 	struct ast_rtp_instance_stats stats;
 	char *print_name = NULL;
 	char *print_time = alloca(32);
 	char codec_in_use[7];
+	int stats_res = -1;
 
 	ast_assert(context->output_buffer != NULL);
 
@@ -357,7 +357,8 @@
 
 	ast_channel_lock(channel);
 
-	session = cpvt->session;
+	cpvt = ast_channel_tech_pvt(channel);
+	session = cpvt ? cpvt->session : NULL;
 	if (!session) {
 		ast_str_append(&context->output_buffer, 0, " %s not valid\n", snapshot->base->name);
 		ast_channel_unlock(channel);
@@ -373,14 +374,13 @@
 		return 0;
 	}
 
-	rtp = ao2_bump(media->rtp);
-
 	codec_in_use[0] = '\0';
 
 	if (ast_channel_rawreadformat(channel)) {
 		ast_copy_string(codec_in_use, ast_format_get_name(ast_channel_rawreadformat(channel)), sizeof(codec_in_use));
 	}
 
+	stats_res = ast_rtp_instance_get_stats(media->rtp, &stats, AST_RTP_INSTANCE_STAT_ALL);
 	ast_channel_unlock(channel);
 
 	print_name = ast_strdupa(snapshot->base->name);
@@ -389,7 +389,7 @@
 
 	ast_format_duration_hh_mm_ss(ast_tvnow().tv_sec - snapshot->base->creationtime.tv_sec, print_time, 32);
 
-	if (ast_rtp_instance_get_stats(rtp, &stats, AST_RTP_INSTANCE_STAT_ALL)) {
+	if (stats_res == -1) {
 		ast_str_append(&context->output_buffer, 0, "%s direct media\n", snapshot->base->name);
 	} else {
 		ast_str_append(&context->output_buffer, 0,
@@ -414,7 +414,6 @@
 		);
 	}
 
-	ao2_cleanup(rtp);
 	ao2_cleanup(channel);
 
 	return 0;

-- 
To view, visit https://gerrit.asterisk.org/c/asterisk/+/13075
To unsubscribe, or for help writing mail filters, visit https://gerrit.asterisk.org/settings

Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Change-Id: I3e05980dd4694577be6d39be2c21a5736bae3c6f
Gerrit-Change-Number: 13075
Gerrit-PatchSet: 1
Gerrit-Owner: Salah Ahmed <txrubel at gmail.com>
Gerrit-Reviewer: Friendly Automation
Gerrit-Reviewer: George Joseph <gjoseph at digium.com>
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20191021/346e3a53/attachment.html>


More information about the asterisk-code-review mailing list