[Asterisk-code-review] res_fax: Don't start a gateway if either channel is hung up (asterisk[13])

George Joseph asteriskteam at digium.com
Thu Jun 4 07:57:03 CDT 2020


George Joseph has uploaded this change for review. ( https://gerrit.asterisk.org/c/asterisk/+/14460 )


Change subject: res_fax: Don't start a gateway if either channel is hung up
......................................................................

res_fax: Don't start a gateway if either channel is hung up

If a channel is hung up when the fax_gateway_framehook is called
and a gateway hasn't already been started, a segfault will occur
when the framehook tries to get the t38 state.

* Added a check of hangup cause for both the channel and peer
  channel before starting a fax gateway.

* Added a check for NULL channel tech to chan_pjsip_queryoption
  so we don't attempt to reference a channel tech that's already
  gone.

ASTERISK-28923
Reported by: Yury Kirsanov

Change-Id: I4e10e63b667bbb68c1c8623f977488f5d807897c
---
M channels/chan_pjsip.c
M res/res_fax.c
2 files changed, 15 insertions(+), 3 deletions(-)



  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/60/14460/1

diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index 79e7c6e..74392c4 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -1116,14 +1116,17 @@
 static int chan_pjsip_queryoption(struct ast_channel *ast, int option, void *data, int *datalen)
 {
 	struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(ast);
-	struct ast_sip_session *session = channel->session;
 	int res = -1;
 	enum ast_t38_state state = T38_STATE_UNAVAILABLE;
 
+	if (!channel) {
+		return -1;
+	}
+
 	switch (option) {
 	case AST_OPTION_T38_STATE:
-		if (session->endpoint->media.t38.enabled) {
-			switch (session->t38state) {
+		if (channel->session->endpoint->media.t38.enabled) {
+			switch (channel->session->t38state) {
 			case T38_LOCAL_REINVITE:
 			case T38_PEER_REINVITE:
 				state = T38_STATE_NEGOTIATING;
diff --git a/res/res_fax.c b/res/res_fax.c
index 1b51dbf..45684c7 100644
--- a/res/res_fax.c
+++ b/res/res_fax.c
@@ -3442,6 +3442,15 @@
 	if (!gateway->bridged) {
 		enum ast_t38_state state_chan;
 		enum ast_t38_state state_peer;
+		int hangupcause_chan;
+		int hangupcause_peer;
+
+		hangupcause_chan = ast_channel_hangupcause(chan);
+		hangupcause_peer = ast_channel_hangupcause(peer);
+		/* Don't start a gateway if either channel is hung up */
+		if (hangupcause_chan > 0 || hangupcause_peer > 0) {
+			return f;
+		}
 
 		ast_channel_unlock(chan);
 		state_chan = ast_channel_get_t38_state(chan);

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

Gerrit-Project: asterisk
Gerrit-Branch: 13
Gerrit-Change-Id: I4e10e63b667bbb68c1c8623f977488f5d807897c
Gerrit-Change-Number: 14460
Gerrit-PatchSet: 1
Gerrit-Owner: George Joseph <gjoseph at digium.com>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20200604/dbf3c75d/attachment-0001.html>


More information about the asterisk-code-review mailing list