From 65812fa2b27b075b4ea6914762ecf5ee658b45dc Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 29 Aug 2014 09:37:33 -0400 Subject: [PATCH] limit the number of times the receive loop can run without breaking --- daemon/call.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index 5cc70903b..fc283890c 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -43,6 +43,10 @@ #define PORT_RANDOM_MAX 20 #endif +#ifndef MAX_RECV_ITERS +#define MAX_RECV_ITERS 50 +#endif + @@ -820,7 +824,7 @@ unlock_out: static void stream_fd_readable(int fd, void *p, uintptr_t u) { struct stream_fd *sfd = p; char buf[RTP_BUFFER_SIZE]; - int ret; + int ret, iters; struct sockaddr_storage ss; struct sockaddr_in6 sin6; struct sockaddr_in *sin; @@ -835,7 +839,15 @@ static void stream_fd_readable(int fd, void *p, uintptr_t u) { log_info_stream_fd(sfd); - for (;;) { + for (iters = 0; ; iters++) { +#if MAX_RECV_ITERS + if (iters >= MAX_RECV_ITERS) { + ilog(LOG_ERROR, "Too many packets in UDP receive queue (more than %d), " + "aborting loop. Dropped packets possible", iters); + break; + } +#endif + sinlen = sizeof(ss); ret = recvfrom(fd, buf + RTP_BUFFER_HEAD_ROOM, MAX_RTP_PACKET_SIZE, 0, (struct sockaddr *) &ss, &sinlen);