[rtmpdump] [PATCH] Fix for rare infinite loop while downloading

Matt Robinson rtmpdump at nerdoftheherd.com
Tue Sep 11 18:37:11 CEST 2012


Fix for an infinite loop on very rare occasions.  The application can 
get into the following state while in the main download loop within the 
Download function in rtmpdump.c:

rtmp->m_read.status == RTMP_READ_EOF
rtmp->m_sb.sb_socket != -1
rtmp->m_sb.sb_timedout == 0

The status of RTMP_READ_EOF causes the call to RTMP_Read to return 
straight away with a value of 0.  This zero value then causes the rest 
of the loop body to be skipped.  However, the values of sb_socket and 
sb_timeout cause the while condition to continue to return true, causing 
an infinite loop.

I'm happy to provide some more information about this issue if that 
would be useful, or if not please find below a patch to prevent this 
from occurring.  Without a fuller understanding of the code I'm not sure 
if this is the right way of solving it, but it is one way...

Matt
---
  rtmpdump.c |    9 ++++++---
  1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/rtmpdump.c b/rtmpdump.c
index e52f7d4..7535da8 100644
--- a/rtmpdump.c
+++ b/rtmpdump.c
@@ -580,13 +580,16 @@ Download(RTMP * rtmp,		// connected RTMP object
  		}
  	    }
  	}
-#ifdef _DEBUG
        else
  	{
+#ifdef _DEBUG
  	  RTMP_Log(RTMP_LOGDEBUG, "zero read!");
-	}
  #endif
-
+	  if(rtmp->m_read.status == RTMP_READ_EOF)
+	    {
+	      break;
+	    }
+	}
      }
    while (!RTMP_ctrlC && nRead > -1 && RTMP_IsConnected(rtmp) && 
!RTMP_IsTimedout(rtmp));
    free(buffer);



More information about the rtmpdump mailing list