Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock

Please unblock package rtmpdump. In jessie streaming to YouTube over RTMP is
broken with timestamps longer thant 24 bits. Also authenticating to Wozwa
servers is broken. These two issues have been fixed upstream.

The fixes are rather small and I'd like to get them included into jessie. Full
debdiff is attached. The changelog is:

rtmpdump (2.4+20150115.gita107cef-1) unstable; urgency=medium

  * Team upload.
  * New upstream snapshot fixing multiple issues when streaming to YouTube and
    Wowza:
    - Fix RTMP streams with timestamps longer than 24 bits.
    - Fix authentication with Wowza 4.x servers.
  * debian/patches/03_suppress_warning.diff: Suppress warning about 24-bit
    timestamps. Thanks to William King.

 -- Sebastian Ramacher <sramac...@debian.org>  Sun, 29 Mar 2015 18:27:52 +0200

unblock rtmpdump/2.4+20150115.gita107cef-1

Cheers
-- 
Sebastian Ramacher
diff -Nru rtmpdump-2.4+20131018.git79459a2/debian/changelog 
rtmpdump-2.4+20150115.gita107cef/debian/changelog
--- rtmpdump-2.4+20131018.git79459a2/debian/changelog   2014-11-11 
15:56:13.000000000 +0100
+++ rtmpdump-2.4+20150115.gita107cef/debian/changelog   2015-03-29 
18:29:14.000000000 +0200
@@ -1,3 +1,15 @@
+rtmpdump (2.4+20150115.gita107cef-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream snapshot fixing multiple issues when streaming to YouTube and
+    Wowza:
+    - Fix RTMP streams with timestamps longer than 24 bits.
+    - Fix authentication with Wowza 4.x servers.
+  * debian/patches/03_suppress_warning.diff: Suppress warning about 24-bit
+    timestamps. Thanks to William King.
+
+ -- Sebastian Ramacher <sramac...@debian.org>  Sun, 29 Mar 2015 18:27:52 +0200
+
 rtmpdump (2.4+20131018.git79459a2-5) unstable; urgency=medium
 
   * Team upload.
diff -Nru 
rtmpdump-2.4+20131018.git79459a2/debian/patches/03_suppress_warning.diff 
rtmpdump-2.4+20150115.gita107cef/debian/patches/03_suppress_warning.diff
--- rtmpdump-2.4+20131018.git79459a2/debian/patches/03_suppress_warning.diff    
1970-01-01 01:00:00.000000000 +0100
+++ rtmpdump-2.4+20150115.gita107cef/debian/patches/03_suppress_warning.diff    
2015-03-29 15:38:38.000000000 +0200
@@ -0,0 +1,14 @@
+Description: Suppress warning
+Author: William King <william.l...@quentustech.com>
+Last-Update: 2015-03-29
+
+--- rtmpdump-2.4+20150115.gita107cef.orig/librtmp/rtmp.c
++++ rtmpdump-2.4+20150115.gita107cef/librtmp/rtmp.c
+@@ -3969,7 +3969,6 @@ RTMP_SendPacket(RTMP *r, RTMPPacket *pac
+     {
+       header -= 4;
+       hSize += 4;
+-      RTMP_Log(RTMP_LOGWARNING, "Larger timestamp than 24-bit: 0x%x", t);
+     }
+ 
+   hptr = header;
diff -Nru rtmpdump-2.4+20131018.git79459a2/debian/patches/series 
rtmpdump-2.4+20150115.gita107cef/debian/patches/series
--- rtmpdump-2.4+20131018.git79459a2/debian/patches/series      2014-10-24 
00:49:28.000000000 +0200
+++ rtmpdump-2.4+20150115.gita107cef/debian/patches/series      2015-03-29 
15:38:53.000000000 +0200
@@ -1,2 +1,3 @@
 01_unbreak_makefile.diff
 02_gnutls_requires.private.diff
+03_suppress_warning.diff
diff -Nru rtmpdump-2.4+20131018.git79459a2/librtmp/rtmp.c 
rtmpdump-2.4+20150115.gita107cef/librtmp/rtmp.c
--- rtmpdump-2.4+20131018.git79459a2/librtmp/rtmp.c     2014-04-08 
02:56:09.000000000 +0200
+++ rtmpdump-2.4+20150115.gita107cef/librtmp/rtmp.c     2015-01-15 
09:24:28.000000000 +0100
@@ -142,6 +142,8 @@
 static int HTTP_Post(RTMP *r, RTMPTCmd cmd, const char *buf, int len);
 static int HTTP_read(RTMP *r, int fill);
 
+static void CloseInternal(RTMP *r, int reconnect);
+
 #ifndef _WIN32
 static int clk_tck;
 #endif
@@ -2538,7 +2540,6 @@
         {
             if (strstr(r->Link.app.av_val, av_authmod_adobe.av_val) != NULL) {
               RTMP_Log(RTMP_LOGERROR, "%s, wrong pubUser & pubPasswd for 
publisher auth", __FUNCTION__);
-              r->Link.pFlags |= RTMP_PUB_CLEAN;
               return 0;
             } else if(r->Link.pubUser.av_len && r->Link.pubPasswd.av_len) {
               pubToken.av_val = malloc(r->Link.pubUser.av_len + 
av_authmod_adobe.av_len + 8);
@@ -2546,10 +2547,8 @@
                       av_authmod_adobe.av_val,
                       r->Link.pubUser.av_val);
               RTMP_Log(RTMP_LOGDEBUG, "%s, pubToken1: %s", __FUNCTION__, 
pubToken.av_val);
-              r->Link.pFlags |= RTMP_PUB_NAME;
             } else {
               RTMP_Log(RTMP_LOGERROR, "%s, need to set pubUser & pubPasswd for 
publisher auth", __FUNCTION__);
-              r->Link.pFlags |= RTMP_PUB_CLEAN;
               return 0;
             }
         }
@@ -2639,25 +2638,21 @@
                     opaque.av_len ? opaque.av_val : "");
             RTMP_Log(RTMP_LOGDEBUG, "%s, pubToken2: %s", __FUNCTION__, 
pubToken.av_val);
             free(orig_ptr);
-            r->Link.pFlags |= RTMP_PUB_RESP|RTMP_PUB_CLATE;
         }
       else if(strstr(description->av_val, "?reason=authfailed") != NULL)
         {
           RTMP_Log(RTMP_LOGERROR, "%s, Authentication failed: wrong password", 
__FUNCTION__);
-          r->Link.pFlags |= RTMP_PUB_CLEAN;
           return 0;
         }
       else if(strstr(description->av_val, "?reason=nosuchuser") != NULL)
         {
           RTMP_Log(RTMP_LOGERROR, "%s, Authentication failed: no such user", 
__FUNCTION__);
-          r->Link.pFlags |= RTMP_PUB_CLEAN;
           return 0;
         }
       else
         {
           RTMP_Log(RTMP_LOGERROR, "%s, Authentication failed: unknown auth 
mode: %s",
                   __FUNCTION__, description->av_val);
-          r->Link.pFlags |= RTMP_PUB_CLEAN;
           return 0;
         }
 
@@ -2665,7 +2660,7 @@
       strncpy(ptr, r->Link.app.av_val, r->Link.app.av_len);
       strncpy(ptr + r->Link.app.av_len, pubToken.av_val, pubToken.av_len);
       r->Link.app.av_len += pubToken.av_len;
-      if(r->Link.pFlags & RTMP_PUB_ALLOC)
+      if(r->Link.lFlags & RTMP_LF_FAPU)
           free(r->Link.app.av_val);
       r->Link.app.av_val = ptr;
 
@@ -2673,12 +2668,12 @@
       strncpy(ptr, r->Link.tcUrl.av_val, r->Link.tcUrl.av_len);
       strncpy(ptr + r->Link.tcUrl.av_len, pubToken.av_val, pubToken.av_len);
       r->Link.tcUrl.av_len += pubToken.av_len;
-      if(r->Link.pFlags & RTMP_PUB_ALLOC)
+      if(r->Link.lFlags & RTMP_LF_FTCU)
           free(r->Link.tcUrl.av_val);
       r->Link.tcUrl.av_val = ptr;
 
       free(pubToken.av_val);
-      r->Link.pFlags |= RTMP_PUB_ALLOC;
+      r->Link.lFlags |= RTMP_LF_FTCU | RTMP_LF_FAPU;
 
       RTMP_Log(RTMP_LOGDEBUG, "%s, new app: %.*s tcUrl: %.*s playpath: %s", 
__FUNCTION__,
               r->Link.app.av_len, r->Link.app.av_val,
@@ -2693,7 +2688,6 @@
 
             if (strstr(r->Link.app.av_val, av_authmod_llnw.av_val) != NULL) {
               RTMP_Log(RTMP_LOGERROR, "%s, wrong pubUser & pubPasswd for 
publisher auth", __FUNCTION__);
-              r->Link.pFlags |= RTMP_PUB_CLEAN;
               return 0;
             } else if(r->Link.pubUser.av_len && r->Link.pubPasswd.av_len) {
               pubToken.av_val = malloc(r->Link.pubUser.av_len + 
av_authmod_llnw.av_len + 8);
@@ -2701,10 +2695,8 @@
                       av_authmod_llnw.av_val,
                       r->Link.pubUser.av_val);
               RTMP_Log(RTMP_LOGDEBUG, "%s, pubToken1: %s", __FUNCTION__, 
pubToken.av_val);
-              r->Link.pFlags |= RTMP_PUB_NAME;
             } else {
               RTMP_Log(RTMP_LOGERROR, "%s, need to set pubUser & pubPasswd for 
publisher auth", __FUNCTION__);
-              r->Link.pFlags |= RTMP_PUB_CLEAN;
               return 0;
             }
         }
@@ -2828,27 +2820,23 @@
                   nonce.av_val, cnonce, nchex, hash3);
           pubToken.av_len = strlen(pubToken.av_val);
           RTMP_Log(RTMP_LOGDEBUG, "%s, pubToken2: %s", __FUNCTION__, 
pubToken.av_val);
-          r->Link.pFlags |= RTMP_PUB_RESP|RTMP_PUB_CLATE;
 
           free(orig_ptr);
         }
       else if(strstr(description->av_val, "?reason=authfail") != NULL)
         {
           RTMP_Log(RTMP_LOGERROR, "%s, Authentication failed", __FUNCTION__);
-          r->Link.pFlags |= RTMP_PUB_CLEAN;
           return 0;
         }
       else if(strstr(description->av_val, "?reason=nosuchuser") != NULL)
         {
           RTMP_Log(RTMP_LOGERROR, "%s, Authentication failed: no such user", 
__FUNCTION__);
-          r->Link.pFlags |= RTMP_PUB_CLEAN;
           return 0;
         }
       else
         {
           RTMP_Log(RTMP_LOGERROR, "%s, Authentication failed: unknown auth 
mode: %s",
                   __FUNCTION__, description->av_val);
-          r->Link.pFlags |= RTMP_PUB_CLEAN;
           return 0;
         }
 
@@ -2856,7 +2844,7 @@
       strncpy(ptr, r->Link.app.av_val, r->Link.app.av_len);
       strncpy(ptr + r->Link.app.av_len, pubToken.av_val, pubToken.av_len);
       r->Link.app.av_len += pubToken.av_len;
-      if(r->Link.pFlags & RTMP_PUB_ALLOC)
+      if(r->Link.lFlags & RTMP_LF_FAPU)
           free(r->Link.app.av_val);
       r->Link.app.av_val = ptr;
 
@@ -2864,12 +2852,12 @@
       strncpy(ptr, r->Link.tcUrl.av_val, r->Link.tcUrl.av_len);
       strncpy(ptr + r->Link.tcUrl.av_len, pubToken.av_val, pubToken.av_len);
       r->Link.tcUrl.av_len += pubToken.av_len;
-      if(r->Link.pFlags & RTMP_PUB_ALLOC)
+      if(r->Link.lFlags & RTMP_LF_FTCU)
           free(r->Link.tcUrl.av_val);
       r->Link.tcUrl.av_val = ptr;
 
       free(pubToken.av_val);
-      r->Link.pFlags |= RTMP_PUB_ALLOC;
+      r->Link.lFlags |= RTMP_LF_FTCU | RTMP_LF_FAPU;
 
       RTMP_Log(RTMP_LOGDEBUG, "%s, new app: %.*s tcUrl: %.*s playpath: %s", 
__FUNCTION__,
               r->Link.app.av_len, r->Link.app.av_val,
@@ -3091,7 +3079,12 @@
               AMFProp_GetString(AMF_GetProp(&obj2, &av_description, -1), 
&description);
               RTMP_Log(RTMP_LOGDEBUG, "%s, error description: %s", 
__FUNCTION__, description.av_val);
               /* if PublisherAuth returns 1, then reconnect */
-              PublisherAuth(r, &description);
+              if (PublisherAuth(r, &description) == 1)
+              {
+                CloseInternal(r, 1);
+                if (!RTMP_Connect(r, NULL) || !RTMP_ConnectStream(r, 0))
+                  goto leave;
+              }
             }
         }
       else
@@ -3107,22 +3100,6 @@
     {
       RTMP_Log(RTMP_LOGERROR, "rtmp server requested close");
       RTMP_Close(r);
-#ifdef CRYPTO
-      if ((r->Link.protocol & RTMP_FEATURE_WRITE) &&
-              !(r->Link.pFlags & RTMP_PUB_CLEAN) &&
-              (  !(r->Link.pFlags & RTMP_PUB_NAME) ||
-                 !(r->Link.pFlags & RTMP_PUB_RESP) ||
-                 (r->Link.pFlags & RTMP_PUB_CLATE) ) )
-        {
-          /* clean later */
-          if(r->Link.pFlags & RTMP_PUB_CLATE)
-              r->Link.pFlags |= RTMP_PUB_CLEAN;
-          RTMP_Log(RTMP_LOGERROR, "authenticating publisher");
-
-          if (!RTMP_Connect(r, NULL) || !RTMP_ConnectStream(r, 0))
-              goto leave;
-       }
-#endif
     }
   else if (AVMATCH(&method, &av_onStatus))
     {
@@ -3988,10 +3965,11 @@
       hSize += cSize;
     }
 
-  if (nSize > 1 && t >= 0xffffff)
+  if (t >= 0xffffff)
     {
       header -= 4;
       hSize += 4;
+      RTMP_Log(RTMP_LOGWARNING, "Larger timestamp than 24-bit: 0x%x", t);
     }
 
   hptr = header;
@@ -4030,7 +4008,7 @@
   if (nSize > 8)
     hptr += EncodeInt32LE(hptr, packet->m_nInfoField2);
 
-  if (nSize > 1 && t >= 0xffffff)
+  if (t >= 0xffffff)
     hptr = AMF_EncodeInt32(hptr, hend, t);
 
   nSize = packet->m_nBodySize;
@@ -4085,6 +4063,11 @@
              header -= cSize;
              hSize += cSize;
            }
+          if (t >= 0xffffff)
+            {
+              header -= 4;
+              hSize += 4;
+            }
          *header = (0xc0 | c);
          if (cSize)
            {
@@ -4093,6 +4076,11 @@
              if (cSize == 2)
                header[2] = tmp >> 8;
            }
+          if (t >= 0xffffff)
+            {
+              char* extendedTimestamp = header + 1 + cSize;
+              AMF_EncodeInt32(extendedTimestamp, extendedTimestamp + 4, t);
+            }
        }
     }
   if (tbuf)
@@ -4136,6 +4124,12 @@
 void
 RTMP_Close(RTMP *r)
 {
+  CloseInternal(r, 0);
+}
+
+static void
+CloseInternal(RTMP *r, int reconnect)
+{
   int i;
 
   if (RTMP_IsConnected(r))
@@ -4215,28 +4209,25 @@
   r->m_resplen = 0;
   r->m_unackd = 0;
 
-  if (r->Link.lFlags & RTMP_LF_FTCU)
+  if (r->Link.lFlags & RTMP_LF_FTCU && !reconnect)
     {
       free(r->Link.tcUrl.av_val);
       r->Link.tcUrl.av_val = NULL;
       r->Link.lFlags ^= RTMP_LF_FTCU;
     }
+  if (r->Link.lFlags & RTMP_LF_FAPU && !reconnect)
+    {
+      free(r->Link.app.av_val);
+      r->Link.app.av_val = NULL;
+      r->Link.lFlags ^= RTMP_LF_FAPU;
+    }
 
-#ifdef CRYPTO
-  if (!(r->Link.protocol & RTMP_FEATURE_WRITE) || (r->Link.pFlags & 
RTMP_PUB_CLEAN))
+  if (!reconnect)
     {
       free(r->Link.playpath0.av_val);
       r->Link.playpath0.av_val = NULL;
     }
-  if ((r->Link.protocol & RTMP_FEATURE_WRITE) &&
-      (r->Link.pFlags & RTMP_PUB_CLEAN) &&
-      (r->Link.pFlags & RTMP_PUB_ALLOC))
-    {
-      free(r->Link.app.av_val);
-      r->Link.app.av_val = NULL;
-      free(r->Link.tcUrl.av_val);
-      r->Link.tcUrl.av_val = NULL;
-    }
+#ifdef CRYPTO
   if (r->Link.dh)
     {
       MDH_free(r->Link.dh);
@@ -4252,9 +4243,6 @@
       RC4_free(r->Link.rc4keyOut);
       r->Link.rc4keyOut = NULL;
     }
-#else
-  free(r->Link.playpath0.av_val);
-  r->Link.playpath0.av_val = NULL;
 #endif
 }
 
diff -Nru rtmpdump-2.4+20131018.git79459a2/librtmp/rtmp.h 
rtmpdump-2.4+20150115.gita107cef/librtmp/rtmp.h
--- rtmpdump-2.4+20131018.git79459a2/librtmp/rtmp.h     2014-04-08 
02:56:09.000000000 +0200
+++ rtmpdump-2.4+20150115.gita107cef/librtmp/rtmp.h     2015-01-15 
09:24:28.000000000 +0100
@@ -171,6 +171,7 @@
 #define RTMP_LF_PLST   0x0008  /* send playlist before play */
 #define RTMP_LF_BUFX   0x0010  /* toggle stream on BufferEmpty msg */
 #define RTMP_LF_FTCU   0x0020  /* free tcUrl on close */
+#define RTMP_LF_FAPU   0x0040  /* free app on close */
     int lFlags;
 
     int swfAge;
@@ -178,12 +179,7 @@
     int protocol;
     int timeout;               /* connection timeout in seconds */
 
-#define RTMP_PUB_NAME   0x0001  /* send login to server */
-#define RTMP_PUB_RESP   0x0002  /* send salted password hash */
-#define RTMP_PUB_ALLOC  0x0004  /* allocated data for new tcUrl & app */
-#define RTMP_PUB_CLEAN  0x0008  /* need to free allocated data for newer tcUrl 
& app at exit */
-#define RTMP_PUB_CLATE  0x0010  /* late clean tcUrl & app at exit */
-    int pFlags;
+    int pFlags;                        /* unused, but kept to avoid breaking 
ABI */
 
     unsigned short socksport;
     unsigned short port;

Attachment: signature.asc
Description: Digital signature

Reply via email to