[asterisk-bugs] [JIRA] (ASTERISK-25299) RTP port leaks with incoming OOH323 calls

Alexandr Dranchuk (JIRA) noreply at issues.asterisk.org
Mon Aug 3 23:31:32 CDT 2015


    [ https://issues.asterisk.org/jira/browse/ASTERISK-25299?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=227136#comment-227136 ] 

Alexandr Dranchuk edited comment on ASTERISK-25299 at 8/3/15 11:29 PM:
-----------------------------------------------------------------------

Hi Alexandr, just compared source code for 13.4.0 and 11.18.0 that I'm using, the BUG in 11.18.0 are NOT fixed in 13.4.0
I found it: (2 weeks of learning and debuging ooh323)
it's when we get call state OO_CALL_CLEARED but Logical Channels still open, and according the code they never closed since function not reached in ooEndCall()
and ooCleanCall() not called.

here is the solution (logs confirming the issue will attach):

for now:
{code:title=ooCalls.c|borderStyle=solid}
int ooEndCall(OOH323CallData *call)
{
   OOTRACEDBGA4("In ooEndCall call state is - %s (%s, %s)\n", 
                 ooGetCallStateText(call->callState), call->callType, 
                 call->callToken);

   if(call->callState == OO_CALL_REMOVED) {
      OOTRACEINFO2("Call already removed %s\n",
                    call->callToken);
     return OO_OK;
   }

   if (call->callIdentifier.guid.numocts == 0) call->callState = OO_CALL_CLEARED;

   if(!call->pH225Channel || call->pH225Channel->sock ==0)
   {
      call->callState = OO_CALL_CLEARED;
   }

   if(call->callState == OO_CALL_CLEARED || call->callState == OO_CALL_CLEAR_RELEASESENT)
   {
      ooCleanCall(call); 
      call->callState = OO_CALL_REMOVED;
      return OO_OK;
   }
*strong*
   if(call->logicalChans)
   {
      OOTRACEINFO3("Clearing all logical channels. (%s, %s)\n", call->callType,
                    call->callToken);
      ooClearAllLogicalChannels(call);
   }
*strong*
{code}

BUT SHOULD BE:
{code:title=ooCalls.c|borderStyle=solid}
int ooEndCall(OOH323CallData *call)
{
   OOTRACEDBGA4("In ooEndCall call state is - %s (%s, %s)\n", 
                 ooGetCallStateText(call->callState), call->callType, 
                 call->callToken);

   if(call->callState == OO_CALL_REMOVED) {
      OOTRACEINFO2("Call already removed %s\n",
                    call->callToken);
     return OO_OK;
   }
+inserted+
   /* First clean all the logical channels, if not already cleaned. */
   if(call->logicalChans)
   {
      OOTRACEINFO3("Clearing all logical channels. (%s, %s)\n", call->callType,
                    call->callToken);
      ooClearAllLogicalChannels(call);
   }
+inserted+
   if (call->callIdentifier.guid.numocts == 0) call->callState = OO_CALL_CLEARED;

   if(!call->pH225Channel || call->pH225Channel->sock ==0)
   {
      call->callState = OO_CALL_CLEARED;
   }

   if(call->callState == OO_CALL_CLEARED || call->callState == OO_CALL_CLEAR_RELEASESENT)
   {
      ooCleanCall(call); 
      call->callState = OO_CALL_REMOVED;
      return OO_OK;
   }
-deleted-
   if(call->logicalChans)
   {
      OOTRACEINFO3("Clearing all logical channels. (%s, %s)\n", call->callType,
                    call->callToken);
      ooClearAllLogicalChannels(call);
   }
-deleted-
{code}


was (Author: dav):
Hi Alexandr, just compared source code for 13.4.0 and 11.18.0 that I'm using, the BUG in 11.18.0 are fixed in 13.4.0
it's when we get call state OO_CALL_CLEARED but Logical Channels still open, and according the code they never closed since function not reached in 11.18.0

can you please update 11 branch?

It's in 13.4.0:

{code:title=ooCalls.c 13.4.0|borderStyle=solid}
int ooCleanCall(OOH323CallData *call)
{
   OOCTXT *pctxt;

   OOTRACEWARN4 ("Cleaning Call (%s, %s)- reason:%s\n", 
                 call->callType, call->callToken, 
                 ooGetReasonCodeText (call->callEndReason));

   /* First clean all the logical channels, if not already cleaned. */
   if(call->logicalChans)
      ooClearAllLogicalChannels(call);
{code}

but in 11.18.0
{code:title=ooCalls.c 11.18.0|borderStyle=solid}
int ooEndCall(OOH323CallData *call)
{
   OOTRACEDBGA4("In ooEndCall call state is - %s (%s, %s)\n", 
                 ooGetCallStateText(call->callState), call->callType, 
                 call->callToken);

   if(call->callState == OO_CALL_REMOVED) {
      OOTRACEINFO2("Call already removed %s\n",
                    call->callToken);
     return OO_OK;
   }

   if (call->callIdentifier.guid.numocts == 0) call->callState = OO_CALL_CLEARED;

   if(!call->pH225Channel || call->pH225Channel->sock ==0)
   {
      call->callState = OO_CALL_CLEARED;
   }

   if(call->callState == OO_CALL_CLEARED || call->callState == OO_CALL_CLEAR_RELEASESENT)
   {
      ooCleanCall(call); 
      call->callState = OO_CALL_REMOVED;
      return OO_OK;
   }

   if(call->logicalChans)
   {
      OOTRACEINFO3("Clearing all logical channels. (%s, %s)\n", call->callType,
                    call->callToken);
      ooClearAllLogicalChannels(call);
   }
{code}

> RTP port leaks with incoming OOH323 calls
> -----------------------------------------
>
>                 Key: ASTERISK-25299
>                 URL: https://issues.asterisk.org/jira/browse/ASTERISK-25299
>             Project: Asterisk
>          Issue Type: Bug
>      Security Level: None
>          Components: Addons/chan_ooh323
>    Affects Versions: 11.19.0
>         Environment: Debian 8.1  x86_64  
>            Reporter: Alexandr Dranchuk
>            Assignee: Alexander Anikin
>
> When we get incoming call thru OOH323 channel with "early media" enabled (MediaWaitForConnect=no;  faststart=yes; tunneling=yes)
> and during ringing call is canceled by caller, the RTP ports are not closed causing RTP port leaking. 



--
This message was sent by Atlassian JIRA
(v6.2#6252)



More information about the asterisk-bugs mailing list