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;
signature.asc
Description: Digital signature