]> granicus.if.org Git - rtmpdump/commitdiff
Give up dataType search if we run out of buffer
authorhyc <hyc@400ebc74-4327-4243-bc38-086b20814532>
Mon, 24 May 2010 13:21:44 +0000 (13:21 +0000)
committerhyc <hyc@400ebc74-4327-4243-bc38-086b20814532>
Mon, 24 May 2010 13:21:44 +0000 (13:21 +0000)
git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@481 400ebc74-4327-4243-bc38-086b20814532

librtmp/rtmp.c

index 6a562bee7b22494b86592601b7f8602b1f7ae1af..0b6a59244004240a29035d629237b2353e507bf6 100644 (file)
@@ -2550,11 +2550,13 @@ HandleMetadata(RTMP *r, char *body, unsigned int len)
          r->m_fDuration = prop.p_vu.p_number;
          /*RTMP_Log(RTMP_LOGDEBUG, "Set duration: %.2f", m_fDuration); */
        }
+#if 0
       /* Search for audio or video tags */
       if (RTMP_FindPrefixProperty(&obj, &av_video, &prop))
         r->m_read.dataType |= 1;
       if (RTMP_FindPrefixProperty(&obj, &av_audio, &prop))
         r->m_read.dataType |= 4;
+#endif
       ret = true;
     }
   AMF_Reset(&obj);
@@ -4089,9 +4091,10 @@ fail:
     {
       if (!(r->m_read.flags & RTMP_READ_RESUME))
        {
-         char *mybuf = malloc(HEADERBUF);
+         char *mybuf = malloc(HEADERBUF), *end = mybuf + HEADERBUF;
          r->m_read.buf = mybuf;
          r->m_read.buflen = HEADERBUF;
+         int cnt = 0;
 
          memcpy(mybuf, flvHeader, sizeof(flvHeader));
          r->m_read.buf += sizeof(flvHeader);
@@ -4108,6 +4111,14 @@ fail:
                  r->m_read.status = nRead;
                  goto fail;
                }
+             /* buffer overflow, fix buffer and give up */
+             if (r->m_read.buf < mybuf || r->m_read.buf > end) {
+               mybuf = realloc(mybuf, cnt + nRead);
+               memcpy(mybuf+cnt, r->m_read.buf, nRead);
+               r->m_read.buf = mybuf+cnt+nRead;
+               break;
+             }
+             cnt += nRead;
              r->m_read.buf += nRead;
              r->m_read.buflen -= nRead;
              if (r->m_read.dataType == 5)