summaryrefslogtreecommitdiff
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:21 -0500
commiteceab15f3339445c37b756c9dbe338f95850741f (patch)
tree0751c3140d9883026f6cc66b2cee87c9e5d484c6
parent57a9797e0ac51eae3b8f3254627646b9698a60d2 (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
-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 ddc6bf622..b6fdb6f49 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",