]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Ensure entering T.38 passthrough does not cause an infinite loop
authorKinsey Moore <kmoore@digium.com>
Thu, 2 Feb 2012 22:27:42 +0000 (22:27 +0000)
committerKinsey Moore <kmoore@digium.com>
Thu, 2 Feb 2012 22:27:42 +0000 (22:27 +0000)
After R340970 Asterisk was still polling the RTCP file descriptor after RTCP is
shut down and removed. If the descriptor happened to have data ready when the
removal occured then Asterisk would go into an infinite loop trying to read
data that it can never actually access. This change disables the audio RTCP
file descriptor for the duration of the T.38 transaction.

(closes issue ASTERISK-18951)
Reported-by: Kristijan Vrban
........

Merged revisions 353915 from http://svn.asterisk.org/svn/asterisk/branches/1.8

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@353916 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index 2556a674c08c98e3d69e191e17c539b6560bdfb4..c0e0bc05ea1f587075b9d42c0d1fc2bfdfa15d14 100644 (file)
@@ -9428,6 +9428,10 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
                        /* Ensure RTCP is enabled since it may be inactive
                           if we're coming back from a T.38 session */
                        ast_rtp_instance_set_prop(p->rtp, AST_RTP_PROPERTY_RTCP, 1);
+                       /* Ensure audio RTCP reads are enabled */
+                       if (p->owner) {
+                               ast_channel_set_fd(p->owner, 1, ast_rtp_instance_fd(p->rtp, 1));
+                       }
 
                        if (ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_AUTO) {
                                ast_clear_flag(&p->flags[0], SIP_DTMF);
@@ -9444,6 +9448,10 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
                } else if (udptlportno > 0) {
                        if (debug)
                                ast_verbose("Got T.38 Re-invite without audio. Keeping RTP active during T.38 session.\n");
+                       /* Prevent audio RTCP reads */
+                       if (p->owner) {
+                               ast_channel_set_fd(p->owner, 1, -1);
+                       }
                        /* Silence RTCP while audio RTP is inactive */
                        ast_rtp_instance_set_prop(p->rtp, AST_RTP_PROPERTY_RTCP, 0);
                } else {