summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorAlexander Anikin <may213@yandex.ru>2016-11-03 22:45:37 +0400
committerAlexander Anikin <may213@yandex.ru>2016-11-03 13:48:33 -0500
commite6b414a66abcc00e812bc45338475c112310cf4e (patch)
treed0503cdbb8d484ed6120329dcae80c01883d3abe /addons
parent7d8b18d3fb79977fc59715defd2457c274084225 (diff)
chan_ooh323: Fix infinite loop on read second part of H.225 packet
Fix logic on read second part of H.225 packet. There was infinite loop on wrong connections due to read before poll. Change-Id: I42b4bf75c46e4a5c5df5c5ca1f0bd74b8944e7ff
Diffstat (limited to 'addons')
-rw-r--r--addons/ooh323c/src/oochannels.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/addons/ooh323c/src/oochannels.c b/addons/ooh323c/src/oochannels.c
index 76f8422a5..a09470db1 100644
--- a/addons/ooh323c/src/oochannels.c
+++ b/addons/ooh323c/src/oochannels.c
@@ -1061,11 +1061,6 @@ int ooH2250Receive(OOH323CallData *call)
while(total < len)
{
struct pollfd pfds;
- recvLen = ooSocketRecv (call->pH225Channel->sock, message1, len-total);
- memcpy(message+total, message1, recvLen);
- total = total + recvLen;
-
- if(total == len) break; /* Complete message is received */
pfds.fd = call->pH225Channel->sock;
pfds.events = POLLIN;
@@ -1085,8 +1080,9 @@ int ooH2250Receive(OOH323CallData *call)
}
return OO_FAILED;
}
- /* If remaining part of the message is not received in 3 seconds
- exit */
+
+ /* exit If remaining part of the message is not received in 3 seconds */
+
if(!ooPDRead(&pfds, 1, call->pH225Channel->sock))
{
OOTRACEERR3("Error: Incomplete H.2250 message received - clearing "
@@ -1099,6 +1095,23 @@ int ooH2250Receive(OOH323CallData *call)
}
return OO_FAILED;
}
+
+ recvLen = ooSocketRecv (call->pH225Channel->sock, message1, len-total);
+ if (recvLen == 0) {
+ OOTRACEERR3("Error in read while receiving H.2250 message - "
+ "clearing call (%s, %s)\n", call->callType,
+ call->callToken);
+ ooFreeQ931Message(pctxt, pmsg);
+ if(call->callState < OO_CALL_CLEAR)
+ {
+ call->callEndReason = OO_REASON_TRANSPORTFAILURE;
+ call->callState = OO_CALL_CLEAR;
+ }
+ return OO_FAILED;
+ }
+ memcpy(message+total, message1, recvLen);
+ total = total + recvLen;
+
}
OOTRACEDBGC3("Received Q.931 message: (%s, %s)\n",