Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package live555 for openSUSE:Factory checked in at 2026-08-26 19:51:18 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/live555 (Old) and /work/SRC/openSUSE:Factory/.live555.new.1258 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "live555" Wed Aug 26 19:51:18 2026 rev:47 rq:1373585 version:2026.08.14 Changes: -------- --- /work/SRC/openSUSE:Factory/live555/live555.changes 2026-06-03 20:22:18.072886614 +0200 +++ /work/SRC/openSUSE:Factory/.live555.new.1258/live555.changes 2026-08-26 19:51:54.813906460 +0200 @@ -1,0 +2,25 @@ +Sat Aug 22 20:32:55 UTC 2026 - Dirk Müller <[email protected]> + +- update to 2026.08.14: + * Fixed a bug that could cause a problem with subclassed variants + of H.264 or H.265 RTP sinks. + * Fixed old code in "GroupsockHelper.cpp" that was using + hardcoded numeric error numbers + * Fixed a memory leak that could occur when parsing a SDP + description that contains two or more + * When adding protection against the use of 'stolen' RTSP session + ids we forgot to do so for every "SETUP" command. This release + fixes that. + * Fixed a typo in "RTSPCommon.cpp": "smtpe" -> "smpte". + * Updated the RTSP server implementation to return a "Unsupported + Transport" error if a "SETUP" request does not include a + "Transport:" header. + * Added "-std=c++20" to the "CPLUSPLUS_FLAGS" line in each + "config.*" file, so that "std::atomic_flag::test" will compile + with compilers that support + * Made the parsing of MP3 audio files more robust to protect + against malformed MP3 data. + * Minor change to "testProgs/testRTSPClient.cpp" to make + compiling on Mac OS X happier. + +------------------------------------------------------------------- Old: ---- live.2026.06.01.tar.gz New: ---- live.2026.08.14.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ live555.spec ++++++ --- /var/tmp/diff_new_pack.bAs5HG/_old 2026-08-26 19:51:56.510966396 +0200 +++ /var/tmp/diff_new_pack.bAs5HG/_new 2026-08-26 19:51:56.517966643 +0200 @@ -17,10 +17,10 @@ # -%define lmdmaj 119 +%define lmdmaj 120 Name: live555 -Version: 2026.06.01 +Version: 2026.08.14 Release: 0 Summary: LIVE555 Streaming Media License: LGPL-2.1-only ++++++ live.2026.06.01.tar.gz -> live.2026.08.14.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/BasicUsageEnvironment/include/BasicUsageEnvironment_version.hh new/live/BasicUsageEnvironment/include/BasicUsageEnvironment_version.hh --- old/live/BasicUsageEnvironment/include/BasicUsageEnvironment_version.hh 2026-06-01 11:12:14.000000000 +0200 +++ new/live/BasicUsageEnvironment/include/BasicUsageEnvironment_version.hh 2026-08-14 14:53:03.000000000 +0200 @@ -19,8 +19,8 @@ #ifndef _BASICUSAGEENVIRONMENT_VERSION_HH #define _BASICUSAGEENVIRONMENT_VERSION_HH -#define BASICUSAGEENVIRONMENT_LIBRARY_VERSION_STRING "2026.06.01" -#define BASICUSAGEENVIRONMENT_LIBRARY_VERSION_INT 1780272000 +#define BASICUSAGEENVIRONMENT_LIBRARY_VERSION_STRING "2026.08.14" +#define BASICUSAGEENVIRONMENT_LIBRARY_VERSION_INT 1786665600 extern char const* const BasicUsageEnvironmentLibraryVersionStr; extern int const BasicUsageEnvironmentLibraryVersionInt; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/UsageEnvironment/include/UsageEnvironment_version.hh new/live/UsageEnvironment/include/UsageEnvironment_version.hh --- old/live/UsageEnvironment/include/UsageEnvironment_version.hh 2026-06-01 11:12:14.000000000 +0200 +++ new/live/UsageEnvironment/include/UsageEnvironment_version.hh 2026-08-14 14:53:03.000000000 +0200 @@ -19,8 +19,8 @@ #ifndef _USAGEENVIRONMENT_VERSION_HH #define _USAGEENVIRONMENT_VERSION_HH -#define USAGEENVIRONMENT_LIBRARY_VERSION_STRING "2026.06.01" -#define USAGEENVIRONMENT_LIBRARY_VERSION_INT 1780272000 +#define USAGEENVIRONMENT_LIBRARY_VERSION_STRING "2026.08.14" +#define USAGEENVIRONMENT_LIBRARY_VERSION_INT 1786665600 extern char const* const UsageEnvironmentLibraryVersionStr; extern int const UsageEnvironmentLibraryVersionInt; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.armeb-uclibc new/live/config.armeb-uclibc --- old/live/config.armeb-uclibc 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.armeb-uclibc 2026-08-14 14:53:19.000000000 +0200 @@ -6,7 +6,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = $(CROSS_COMPILE)g++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 OBJ = o LINK = $(CROSS_COMPILE)gcc -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.armlinux new/live/config.armlinux --- old/live/config.armlinux 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.armlinux 2026-08-14 14:53:19.000000000 +0200 @@ -5,7 +5,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = $(CROSS_COMPILE)g++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 OBJ = o LINK = $(CROSS_COMPILE)g++ -o LINK_OPTS = diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.avr32-linux new/live/config.avr32-linux --- old/live/config.avr32-linux 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.avr32-linux 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = $(CROSS_COMPILE)c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -fuse-cxa-atexit -DBSD=1 OBJ = o +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -fuse-cxa-atexit -DBSD=1 OBJ = o LINK = $(CROSS_COMPILE)c++ -o LINK_OPTS = CONSOLE_LINK_OPTS = $(LINK_OPTS) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.bfin-linux-uclibc new/live/config.bfin-linux-uclibc --- old/live/config.bfin-linux-uclibc 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.bfin-linux-uclibc 2026-08-14 14:53:19.000000000 +0200 @@ -2,10 +2,10 @@ COMPILE_OPTS = $(INCLUDES) -I/usr/local/include -I. -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -DUCLINUX -D_FILE_OFFSET_BITS=64 C = c C_COMPILER = $(CROSS_COMPILER)gcc -C_FLAGS = $(COMPILE_OPTS) -Wall +C_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall CPP = cpp CPLUSPLUS_COMPILER = $(CROSS_COMPILER)g++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall OBJ = o LINK = $(CROSS_COMPILER)g++ -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.bfin-uclinux new/live/config.bfin-uclinux --- old/live/config.bfin-uclinux 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.bfin-uclinux 2026-08-14 14:53:19.000000000 +0200 @@ -2,10 +2,10 @@ COMPILE_OPTS = $(INCLUDES) -I/usr/local/include -I. -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -DUCLINUX -D_FILE_OFFSET_BITS=64 C = c C_COMPILER = $(CROSS_COMPILER)gcc -C_FLAGS = $(COMPILE_OPTS) -Wall +C_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall CPP = cpp CPLUSPLUS_COMPILER = $(CROSS_COMPILER)g++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall OBJ = o LINK = $(CROSS_COMPILER)g++ -Wl,-elf2flt -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.bsplinux new/live/config.bsplinux --- old/live/config.bsplinux 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.bsplinux 2026-08-14 14:53:19.000000000 +0200 @@ -5,7 +5,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = $(CROSS_COMPILE)e++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 OBJ = o LINK = $(CROSS_COMPILE)e++ -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.cris-axis-linux-gnu new/live/config.cris-axis-linux-gnu --- old/live/config.cris-axis-linux-gnu 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.cris-axis-linux-gnu 2026-08-14 14:53:19.000000000 +0200 @@ -3,7 +3,7 @@ # See http://developer.axis.com/doc/software/apps/apps-howto.html # for more information. AXIS_DIR = $(AXIS_TOP_DIR)/target/cris-axis-linux-gnu -COMPILE_OPTS = $(INCLUDES) -I. -mlinux -isystem $(AXIS_DIR)/include -I/usr/local/include -Wall -O2 -DSOCKLEN_T=socklen_t -DCRIS -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 +COMPILE_OPTS = $(INCLUDES) -I. -mlinux -isystem $(AXIS_DIR)/include -I/usr/local/include -std=c++20 -Wall -O2 -DSOCKLEN_T=socklen_t -DCRIS -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 C = c C_COMPILER = gcc-cris C_FLAGS = $(COMPILE_OPTS) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.cygwin new/live/config.cygwin --- old/live/config.cygwin 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.cygwin 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) -DUSE_OUR_BZERO=1 -D__CYGWIN__ CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 OBJ = o LINK = c++ -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.cygwin-for-vlc new/live/config.cygwin-for-vlc --- old/live/config.cygwin-for-vlc 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.cygwin-for-vlc 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) -DUSE_OUR_BZERO=1 -D_WIN32 -mno-cygwin CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 -D_WIN32 -Wno-deprecated -mno-cygwin +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 -D_WIN32 -Wno-deprecated -mno-cygwin OBJ = o LINK = c++ -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.freebsd new/live/config.freebsd --- old/live/config.freebsd 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.freebsd 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall OBJ = o LINK = c++ -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.freebsd-no-openssl new/live/config.freebsd-no-openssl --- old/live/config.freebsd-no-openssl 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.freebsd-no-openssl 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall OBJ = o LINK = c++ -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.iphone-simulator new/live/config.iphone-simulator --- old/live/config.iphone-simulator 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.iphone-simulator 2026-08-14 14:53:19.000000000 +0200 @@ -15,7 +15,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = /usr/bin/xcrun clang -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall OBJ = o LINK = /usr/bin/xcrun clang -o LINK_OPTS = -L. -arch i386 -miphoneos-version-min=$(MIN_IOS_VERSION) --sysroot=$(SDK) -isysroot -L$(SDK)/usr/lib/system -I$(SDK)/usr/lib /usr/lib/libc++.dylib diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.iphoneos new/live/config.iphoneos --- old/live/config.iphoneos 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.iphoneos 2026-08-14 14:53:19.000000000 +0200 @@ -14,7 +14,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = /usr/bin/xcrun clang -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall OBJ = o LINK = /usr/bin/xcrun clang -o LINK_OPTS = -v -L. -arch armv7 --sysroot=$(SDK) -L$(SDK)/usr/lib/system /usr/lib/libc++.dylib diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.linux new/live/config.linux --- old/live/config.linux 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.linux 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) $(CPPFLAGS) $(CFLAGS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 $(CPPFLAGS) $(CXXFLAGS) +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 $(CPPFLAGS) $(CXXFLAGS) OBJ = o LINK = c++ -o LINK_OPTS = -L. $(LDFLAGS) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.linux-64bit new/live/config.linux-64bit --- old/live/config.linux-64bit 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.linux-64bit 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 OBJ = o LINK = c++ -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.linux-gdb new/live/config.linux-gdb --- old/live/config.linux-gdb 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.linux-gdb 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 OBJ = o LINK = c++ -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.linux-gdb-no-std-lib new/live/config.linux-gdb-no-std-lib --- old/live/config.linux-gdb-no-std-lib 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.linux-gdb-no-std-lib 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) $(CPPFLAGS) $(CFLAGS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 $(CPPFLAGS) $(CXXFLAGS) +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 $(CPPFLAGS) $(CXXFLAGS) OBJ = o LINK = c++ -o LINK_OPTS = -L. $(LDFLAGS) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.linux-gdb-sanitize new/live/config.linux-gdb-sanitize --- old/live/config.linux-gdb-sanitize 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.linux-gdb-sanitize 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 OBJ = o LINK = c++ -o LINK_OPTS = -L. -lasan -lubsan diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.linux-no-openssl new/live/config.linux-no-openssl --- old/live/config.linux-no-openssl 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.linux-no-openssl 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) $(CPPFLAGS) $(CFLAGS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 $(CPPFLAGS) $(CXXFLAGS) +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 $(CPPFLAGS) $(CXXFLAGS) OBJ = o LINK = c++ -o LINK_OPTS = -L. $(LDFLAGS) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.linux-no-std-lib new/live/config.linux-no-std-lib --- old/live/config.linux-no-std-lib 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.linux-no-std-lib 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) $(CPPFLAGS) $(CFLAGS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 $(CPPFLAGS) $(CXXFLAGS) +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 $(CPPFLAGS) $(CXXFLAGS) OBJ = o LINK = c++ -o LINK_OPTS = -L. $(LDFLAGS) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.linux-with-shared-libraries new/live/config.linux-with-shared-libraries --- old/live/config.linux-with-shared-libraries 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.linux-with-shared-libraries 2026-08-14 14:53:19.000000000 +0200 @@ -3,8 +3,8 @@ # At least one interface changes, or is removed => CURRENT += 1; REVISION = 0; AGE = 0 # One or more interfaces were added, but no existing interfaces were changed or removed => CURRENT += 1; REVISION = 0; AGE += 1 -libliveMedia_VERSION_CURRENT=119 -libliveMedia_VERSION_REVISION=2 +libliveMedia_VERSION_CURRENT=120 +libliveMedia_VERSION_REVISION=8 libliveMedia_VERSION_AGE=0 libliveMedia_LIB_SUFFIX=so.$(shell expr $(libliveMedia_VERSION_CURRENT) - $(libliveMedia_VERSION_AGE)).$(libliveMedia_VERSION_AGE).$(libliveMedia_VERSION_REVISION) @@ -19,7 +19,7 @@ libUsageEnvironment_LIB_SUFFIX=so.$(shell expr $(libUsageEnvironment_VERSION_CURRENT) - $(libUsageEnvironment_VERSION_AGE)).$(libUsageEnvironment_VERSION_AGE).$(libUsageEnvironment_VERSION_REVISION) libgroupsock_VERSION_CURRENT=33 -libgroupsock_VERSION_REVISION=0 +libgroupsock_VERSION_REVISION=1 libgroupsock_VERSION_AGE=0 libgroupsock_LIB_SUFFIX=so.$(shell expr $(libgroupsock_VERSION_CURRENT) - $(libgroupsock_VERSION_AGE)).$(libgroupsock_VERSION_AGE).$(libgroupsock_VERSION_REVISION) ##### @@ -30,7 +30,7 @@ C_FLAGS = $(COMPILE_OPTS) $(CPPFLAGS) $(CFLAGS) CPP = cpp CPLUSPLUS_COMPILER = $(CXX) -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 $(CPPFLAGS) $(CXXFLAGS) +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 $(CPPFLAGS) $(CXXFLAGS) OBJ = o LINK = $(CXX) -o LINK_OPTS = -L. $(LDFLAGS) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.macosx-bigsur new/live/config.macosx-bigsur --- old/live/config.macosx-bigsur 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.macosx-bigsur 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall OBJ = o LINK = c++ -o LINK_OPTS = -L. -L/usr/local/ssl/lib diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.macosx-catalina new/live/config.macosx-catalina --- old/live/config.macosx-catalina 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.macosx-catalina 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall OBJ = o LINK = c++ -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.macosx-no-openssl new/live/config.macosx-no-openssl --- old/live/config.macosx-no-openssl 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.macosx-no-openssl 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall OBJ = o LINK = c++ -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.mingw new/live/config.mingw --- old/live/config.mingw 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.mingw 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) -DUSE_OUR_BZERO=1 -D__MINGW32__ CPP = cpp CPLUSPLUS_COMPILER = $(CXX) -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -D__MINGW32__ -Wall -Wno-deprecated +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -D__MINGW32__ -std=c++20 -Wall -Wno-deprecated OBJ = o LINK = $(CXX) -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.openbsd new/live/config.openbsd --- old/live/config.openbsd 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.openbsd 2026-08-14 14:53:19.000000000 +0200 @@ -5,7 +5,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DAIX=1 +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DAIX=1 OBJ = o LINK = c++ -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.raspberrypi new/live/config.raspberrypi --- old/live/config.raspberrypi 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.raspberrypi 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) $(CPPFLAGS) $(CFLAGS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 $(CPPFLAGS) $(CXXFLAGS) +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 $(CPPFLAGS) $(CXXFLAGS) OBJ = o LINK = c++ -o LINK_OPTS = -L. $(LDFLAGS) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.solaris-32bit new/live/config.solaris-32bit --- old/live/config.solaris-32bit 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.solaris-32bit 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall OBJ = o LINK = c++ -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.solaris-64bit new/live/config.solaris-64bit --- old/live/config.solaris-64bit 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.solaris-64bit 2026-08-14 14:53:19.000000000 +0200 @@ -4,7 +4,7 @@ C_FLAGS = $(COMPILE_OPTS) CPP = cpp CPLUSPLUS_COMPILER = c++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall OBJ = o LINK = c++ -m64 -o LINK_OPTS = -L. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/config.uClinux new/live/config.uClinux --- old/live/config.uClinux 2026-06-01 11:12:24.000000000 +0200 +++ new/live/config.uClinux 2026-08-14 14:53:19.000000000 +0200 @@ -6,7 +6,7 @@ C_FLAGS = $(CFLAGS) CPP = cpp CPLUSPLUS_COMPILER = $(CROSS_COMPILE)g++ -CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1 +CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -std=c++20 -Wall -DBSD=1 CPLUSPLUS_FLAGS += $(CPPFLAGS) -fexceptions OBJ = o LINK = $(CROSS_COMPILE)g++ -o diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/groupsock/GroupsockHelper.cpp new/live/groupsock/GroupsockHelper.cpp --- old/live/groupsock/GroupsockHelper.cpp 2026-06-01 11:12:14.000000000 +0200 +++ new/live/groupsock/GroupsockHelper.cpp 2026-08-14 14:53:03.000000000 +0200 @@ -420,7 +420,7 @@ if (bytesRead < 0) { //##### HACK to work around bugs in Linux and Windows: int err = env.getErrno(); - if (err == 111 /*ECONNREFUSED (Linux)*/ + if (err == ECONNREFUSED /*(Linux)*/ #if defined(__WIN32__) || defined(_WIN32) // What a piece of crap Windows is. Sometimes // recvfrom() returns -1, but with an 'errno' of 0. @@ -432,7 +432,7 @@ #else || err == EAGAIN #endif - || err == 113 /*EHOSTUNREACH (Linux)*/) { // Why does Linux return this for datagram sock? + || err == EHOSTUNREACH /*(Linux)*/) { // Why does Linux return this for datagram sock? return 0; } //##### END HACK diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/groupsock/include/groupsock_version.hh new/live/groupsock/include/groupsock_version.hh --- old/live/groupsock/include/groupsock_version.hh 2026-06-01 11:12:14.000000000 +0200 +++ new/live/groupsock/include/groupsock_version.hh 2026-08-14 14:53:03.000000000 +0200 @@ -19,8 +19,8 @@ #ifndef _GROUPSOCK_VERSION_HH #define _GROUPSOCK_VERSION_HH -#define GROUPSOCK_LIBRARY_VERSION_STRING "2026.06.01" -#define GROUPSOCK_LIBRARY_VERSION_INT 1780272000 +#define GROUPSOCK_LIBRARY_VERSION_STRING "2026.08.14" +#define GROUPSOCK_LIBRARY_VERSION_INT 1786665600 extern char const* const groupsockLibraryVersionStr; extern int const groupsockLibraryVersionInt; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/H264or5VideoRTPSink.cpp new/live/liveMedia/H264or5VideoRTPSink.cpp --- old/live/liveMedia/H264or5VideoRTPSink.cpp 2026-06-01 11:12:14.000000000 +0200 +++ new/live/liveMedia/H264or5VideoRTPSink.cpp 2026-08-14 14:53:03.000000000 +0200 @@ -116,8 +116,9 @@ // First, check whether we have a 'fragmenter' class set up yet. // If not, create it now: if (fOurFragmenter == NULL) { - fOurFragmenter = new H264or5Fragmenter(fHNumber, envir(), fSource, OutPacketBuffer::maxSize, - ourMaxPacketSize() - 12/*RTP hdr size*/); + fOurFragmenter + = new H264or5Fragmenter(fHNumber, envir(), fSource, OutPacketBuffer::maxSize, + ourMaxPacketSize() - 12/*RTP hdr size*/ - specialHeaderSize()); } else { fOurFragmenter->reassignInputSource(fSource); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/MP3Internals.cpp new/live/liveMedia/MP3Internals.cpp --- old/live/liveMedia/MP3Internals.cpp 2026-06-01 11:12:14.000000000 +0200 +++ new/live/liveMedia/MP3Internals.cpp 2026-08-14 14:53:03.000000000 +0200 @@ -48,7 +48,7 @@ int shortDiff[13]; }; -static struct bandInfoStruct const bandInfo[7] = { +static struct bandInfoStruct const bandInfo[10] = { /* MPEG 1.0 */ { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576}, {4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158}, @@ -85,6 +85,21 @@ { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } , {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} , + {4,4,4,6,6,8,10,14,18,26,32,42,18 } } , + + { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, + {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } , + {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} , + {4,4,4,6,6,8,10,14,18,26,32,42,18 } } , + + { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, + {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } , + {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} , + {4,4,4,6,6,8,10,14,18,26,32,42,18 } } , + + { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, + {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } , + {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} , {4,4,4,6,6,8,10,14,18,26,32,42,18 } } , }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/MatroskaFileParser.cpp new/live/liveMedia/MatroskaFileParser.cpp --- old/live/liveMedia/MatroskaFileParser.cpp 2026-06-01 11:12:14.000000000 +0200 +++ new/live/liveMedia/MatroskaFileParser.cpp 2026-08-14 14:53:03.000000000 +0200 @@ -340,7 +340,8 @@ #ifdef DEBUG fprintf(stderr, "\tTrack Number %d\n", trackNumber); #endif - if (track != NULL && trackNumber != 0) { + if (track != NULL && trackNumber != 0 + && track->trackNumber == 0 /* this track doesn't already have a number */) { track->trackNumber = trackNumber; fOurFile.addTrack(track, trackNumber); } @@ -489,12 +490,11 @@ } case MATROSKA_ID_CODEC_PRIVATE: { u_int8_t* codecPrivate; - unsigned codecPrivateSize; - if (parseEBMLVal_binary(size, codecPrivate)) { - codecPrivateSize = (unsigned)size.val(); + u_int32_t codecPrivateSize; + if (parseEBMLVal_binary_constrainSize(size, codecPrivateSize, codecPrivate)) { #ifdef DEBUG fprintf(stderr, "\tCodec Private: "); - for (unsigned i = 0; i < codecPrivateSize; ++i) fprintf(stderr, "%02x:", codecPrivate[i]); + for (u_int32_t i = 0; i < codecPrivateSize; ++i) fprintf(stderr, "%02x:", codecPrivate[i]); fprintf(stderr, "\n"); #endif if (track != NULL) { @@ -654,12 +654,11 @@ } case MATROSKA_ID_CONTENT_COMP_SETTINGS: { u_int8_t* headerStrippedBytes; - unsigned headerStrippedBytesSize; - if (parseEBMLVal_binary(size, headerStrippedBytes)) { - headerStrippedBytesSize = (unsigned)size.val(); + u_int32_t headerStrippedBytesSize; + if (parseEBMLVal_binary_constrainSize(size, headerStrippedBytesSize, headerStrippedBytes)) { #ifdef DEBUG fprintf(stderr, "\tHeader Stripped Bytes: "); - for (unsigned i = 0; i < headerStrippedBytesSize; ++i) fprintf(stderr, "%02x:", headerStrippedBytes[i]); + for (u_int32_t i = 0; i < headerStrippedBytesSize; ++i) fprintf(stderr, "%02x:", headerStrippedBytes[i]); fprintf(stderr, "\n"); #endif if (track != NULL) { @@ -678,9 +677,8 @@ } case MATROSKA_ID_COLOR_SPACE: { u_int8_t* colourSpace; - unsigned colourSpaceSize; - if (parseEBMLVal_binary(size, colourSpace)) { - colourSpaceSize = (unsigned)size.val(); + u_int32_t colourSpaceSize; + if (parseEBMLVal_binary_constrainSize(size, colourSpaceSize, colourSpace)) { #ifdef DEBUG fprintf(stderr, "\tColor space : %02x %02x %02x %02x\n", colourSpace[0], colourSpace[1], colourSpace[2], colourSpace[3]); #endif @@ -1354,7 +1352,7 @@ return parseEBMLNumber(id) && parseEBMLNumber(size); } -Boolean MatroskaFileParser::parseEBMLVal_unsigned64(EBMLDataSize& size, u_int64_t& result) { +Boolean MatroskaFileParser::parseEBMLVal_unsigned64(EBMLDataSize const& size, u_int64_t& result) { u_int64_t sv = size.val(); if (sv > 8) return False; // size too large @@ -1371,7 +1369,7 @@ return True; } -Boolean MatroskaFileParser::parseEBMLVal_unsigned(EBMLDataSize& size, unsigned& result) { +Boolean MatroskaFileParser::parseEBMLVal_unsigned(EBMLDataSize const& size, unsigned& result) { if (size.val() > 4) return False; // size too large u_int64_t result64; @@ -1382,7 +1380,7 @@ return True; } -Boolean MatroskaFileParser::parseEBMLVal_float(EBMLDataSize& size, float& result) { +Boolean MatroskaFileParser::parseEBMLVal_float(EBMLDataSize const& size, float& result) { if (size.val() == 4) { // Normal case. Read the value as if it were a 4-byte integer, then copy it to the 'float' result: unsigned resultAsUnsigned; @@ -1408,13 +1406,13 @@ } } -Boolean MatroskaFileParser::parseEBMLVal_string(EBMLDataSize& size, char*& result) { - unsigned resultLength = (unsigned)size.val(); +Boolean MatroskaFileParser::parseEBMLVal_string(EBMLDataSize const& size, char*& result) { + u_int64_t resultLength = size.val(); result = new char[resultLength + 1]; // allow for the trailing '\0' if (result == NULL) return False; char* p = result; - unsigned i; + u_int64_t i; for (i = 0; i < resultLength; ++i) { if (fLimitOffsetInFile > 0 && fCurOffsetInFile > fLimitOffsetInFile) break; // We've hit our pre-set limit @@ -1433,13 +1431,13 @@ return True; } -Boolean MatroskaFileParser::parseEBMLVal_binary(EBMLDataSize& size, u_int8_t*& result) { - unsigned resultLength = (unsigned)size.val(); +Boolean MatroskaFileParser::parseEBMLVal_binary(EBMLDataSize const& size, u_int8_t*& result) { + u_int64_t resultLength = size.val(); result = new u_int8_t[resultLength]; if (result == NULL) return False; u_int8_t* p = result; - unsigned i; + u_int64_t i; for (i = 0; i < resultLength; ++i) { if (fLimitOffsetInFile > 0 && fCurOffsetInFile > fLimitOffsetInFile) break; // We've hit our pre-set limit @@ -1449,11 +1447,28 @@ *p++ = c; } if (i < resultLength) { // an error occurred - delete[] result; - result = NULL; + delete[] result; result = NULL; + return False; + } + + return True; +} + +Boolean MatroskaFileParser +::parseEBMLVal_binary_constrainSize(EBMLDataSize const& size, u_int32_t& length, u_int8_t*& result) { + if (!parseEBMLVal_binary(size, result)) { + length = 0; + return False; + } + + if (size.val() > (u_int64_t)0xFFFFFFFF) { + // size would not fit into 32 bits => reject this + delete[] result; result = NULL; + length = 0; return False; } + length = (u_int32_t)size.val(); return True; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/MatroskaFileParser.hh new/live/liveMedia/MatroskaFileParser.hh --- old/live/liveMedia/MatroskaFileParser.hh 2026-06-01 11:12:14.000000000 +0200 +++ new/live/liveMedia/MatroskaFileParser.hh 2026-08-14 14:53:03.000000000 +0200 @@ -78,12 +78,16 @@ Boolean parseEBMLNumber(EBMLNumber& num); Boolean parseEBMLIdAndSize(EBMLId& id, EBMLDataSize& size); - Boolean parseEBMLVal_unsigned64(EBMLDataSize& size, u_int64_t& result); - Boolean parseEBMLVal_unsigned(EBMLDataSize& size, unsigned& result); - Boolean parseEBMLVal_float(EBMLDataSize& size, float& result); - Boolean parseEBMLVal_string(EBMLDataSize& size, char*& result); + Boolean parseEBMLVal_unsigned64(EBMLDataSize const& size, u_int64_t& result); + Boolean parseEBMLVal_unsigned(EBMLDataSize const& size, unsigned& result); + Boolean parseEBMLVal_float(EBMLDataSize const& size, float& result); + Boolean parseEBMLVal_string(EBMLDataSize const& size, char*& result); // Note: "result" is dynamically allocated; the caller must delete[] it later - Boolean parseEBMLVal_binary(EBMLDataSize& size, u_int8_t*& result); + Boolean parseEBMLVal_binary(EBMLDataSize const& size, u_int8_t*& result); + // Note: "result" is dynamically allocated; the caller must delete[] it later + Boolean parseEBMLVal_binary_constrainSize(EBMLDataSize const& size, u_int32_t& length, u_int8_t*& result); + // A version of "parseEBMLVal_binary()" where the result size is constrained to fit + // into a "u_int32_t". // Note: "result" is dynamically allocated; the caller must delete[] it later void skipHeader(EBMLDataSize const& size); void skipRemainingHeaderBytes(Boolean isContinuation); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/MediaSession.cpp new/live/liveMedia/MediaSession.cpp --- old/live/liveMedia/MediaSession.cpp 2026-06-01 11:12:14.000000000 +0200 +++ new/live/liveMedia/MediaSession.cpp 2026-08-14 14:53:03.000000000 +0200 @@ -390,10 +390,10 @@ char* ae = new char[len]; int sscanfResult = sscanf(sdpLine, "a=range: clock = %[^-\r\n]-%[^\r\n]", as, ae); if (sscanfResult == 2) { - absStartTime = as; - absEndTime = ae; + delete[] absStartTime; absStartTime = as; + delete[] absEndTime; absEndTime = ae; } else if (sscanfResult == 1) { - absStartTime = as; + delete[] absStartTime; absStartTime = as; delete[] ae; } else { delete[] as; delete[] ae; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/OggFileParser.cpp new/live/liveMedia/OggFileParser.cpp --- old/live/liveMedia/OggFileParser.cpp 2026-06-01 11:12:14.000000000 +0200 +++ new/live/liveMedia/OggFileParser.cpp 2026-08-14 14:53:03.000000000 +0200 @@ -132,7 +132,9 @@ OggTrack* track; if ((header_type_flag&0x02) != 0) { // BOS char const* mimeType = NULL; // if unknown - if (fPacketSizeTable != NULL && fPacketSizeTable->size[0] >= 8) { // sanity check + if (fPacketSizeTable != NULL + && fPacketSizeTable->numCompletedPackets > 0 + && fPacketSizeTable->size[0] >= 8) { // sanity check char buf[8]; testBytes((u_int8_t*)buf, 8); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/RTSPCommon.cpp new/live/liveMedia/RTSPCommon.cpp --- old/live/liveMedia/RTSPCommon.cpp 2026-06-01 11:12:14.000000000 +0200 +++ new/live/liveMedia/RTSPCommon.cpp 2026-08-14 14:53:03.000000000 +0200 @@ -272,8 +272,8 @@ delete[] as; delete[] ae; return False; } - } else if (sscanf(paramStr, "smtpe = %n", &numCharsMatched4) == 0 && numCharsMatched4 > 0) { - // We accept "smtpe=" parameters, but currently do not interpret them. + } else if (sscanf(paramStr, "smpte = %n", &numCharsMatched4) == 0 && numCharsMatched4 > 0) { + // We accept "smpte=" parameters, but currently do not interpret them. } else { return False; // The header is malformed } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/RTSPServer.cpp new/live/liveMedia/RTSPServer.cpp --- old/live/liveMedia/RTSPServer.cpp 2026-06-01 11:12:14.000000000 +0200 +++ new/live/liveMedia/RTSPServer.cpp 2026-08-14 14:53:03.000000000 +0200 @@ -628,6 +628,9 @@ // can find us: if (fOurRTSPServer.fClientConnectionsForHTTPTunneling == NULL) { fOurRTSPServer.fClientConnectionsForHTTPTunneling = HashTable::create(STRING_HASH_KEYS); + } else if (fOurSessionCookie != NULL) { + // This connection can have only one 'session cookie' in use at one time: + fOurRTSPServer.fClientConnectionsForHTTPTunneling->Remove(fOurSessionCookie); } delete[] fOurSessionCookie; fOurSessionCookie = strDup(sessionCookie); fOurRTSPServer.fClientConnectionsForHTTPTunneling->Add(sessionCookie, (void*)this); @@ -886,36 +889,33 @@ } else if (strcmp(cmdName, "DESCRIBE") == 0) { handleCmd_DESCRIBE(urlPreSuffix, urlSuffix, (char const*)fRequestBuffer); } else if (strcmp(cmdName, "SETUP") == 0) { - Boolean areAuthenticated = True; + // First, make sure that we're authenticated to perform this command: + char urlTotalSuffix[2*RTSP_PARAM_STRING_MAX]; + // enough space for urlPreSuffix/urlSuffix'\0' + urlTotalSuffix[0] = '\0'; + if (urlPreSuffix[0] != '\0') { + strcat(urlTotalSuffix, urlPreSuffix); + strcat(urlTotalSuffix, "/"); + } + strcat(urlTotalSuffix, urlSuffix); - if (!requestIncludedSessionId) { - // No session id was present in the request. - // So create a new "RTSPClientSession" object for this request. - - // But first, make sure that we're authenticated to perform this command: - char urlTotalSuffix[2*RTSP_PARAM_STRING_MAX]; - // enough space for urlPreSuffix/urlSuffix'\0' - urlTotalSuffix[0] = '\0'; - if (urlPreSuffix[0] != '\0') { - strcat(urlTotalSuffix, urlPreSuffix); - strcat(urlTotalSuffix, "/"); - } - strcat(urlTotalSuffix, urlSuffix); - if (authenticationOK("SETUP", urlTotalSuffix, (char const*)fRequestBuffer)) { + if (authenticationOK("SETUP", urlTotalSuffix, (char const*)fRequestBuffer)) { + if (!requestIncludedSessionId) { + // No session id was present in the request. + // So create a new "RTSPClientSession" object for this request. clientSession = (RTSPServer::RTSPClientSession*)fOurRTSPServer.createNewClientSessionWithId(); - } else { - areAuthenticated = False; } - } - if (clientSession != NULL) { - clientSession->handleCmd_SETUP(this, urlPreSuffix, urlSuffix, (char const*)fRequestBuffer); - playAfterSetup = clientSession->fStreamAfterSETUP; - } else if (areAuthenticated) { + + if (clientSession != NULL) { + clientSession->handleCmd_SETUP(this, urlPreSuffix, urlSuffix, (char const*)fRequestBuffer); + playAfterSetup = clientSession->fStreamAfterSETUP; + } else { #ifdef DEBUG - fprintf(stderr, "Calling handleCmd_sessionNotFound() (case 2)\n"); + fprintf(stderr, "Calling handleCmd_sessionNotFound() (case 2)\n"); #endif - handleCmd_sessionNotFound(); + handleCmd_sessionNotFound(); + } } } else if (strcmp(cmdName, "TEARDOWN") == 0 || strcmp(cmdName, "PLAY") == 0 @@ -1312,37 +1312,37 @@ } typedef enum StreamingMode { + UNKNOWN, RTP_UDP, RTP_TCP, RAW_UDP } StreamingMode; -static void parseTransportHeader(char const* buf, - StreamingMode& streamingMode, - char*& streamingModeString, - char*& destinationAddressStr, - u_int8_t& destinationTTL, - portNumBits& clientRTPPortNum, // if UDP - portNumBits& clientRTCPPortNum, // if UDP - unsigned char& rtpChannelId, // if TCP - unsigned char& rtcpChannelId // if TCP - ) { +static Boolean parseTransportHeader(char const* buf, + StreamingMode& streamingMode, + char*& streamingModeString, + char*& destinationAddressStr, + u_int8_t& destinationTTL, + portNumBits& clientRTPPortNum, // if UDP + portNumBits& clientRTCPPortNum, // if UDP + u_int8_t& rtpChannelId, // if TCP + u_int8_t& rtcpChannelId // if TCP + ) { // Initialize the result parameters to default values: - streamingMode = RTP_UDP; + streamingMode = UNKNOWN; streamingModeString = NULL; destinationAddressStr = NULL; - destinationTTL = 255; + destinationTTL = 0xFF; clientRTPPortNum = 0; clientRTCPPortNum = 1; rtpChannelId = rtcpChannelId = 0xFF; - portNumBits p1, p2; - unsigned ttl, rtpCid, rtcpCid; + unsigned p1, p2, ttl, rtpCid, rtcpCid; // First, find "Transport:" while (1) { - if (*buf == '\0') return; // not found - if (*buf == '\r' && *(buf+1) == '\n' && *(buf+2) == '\r') return; // end of the headers => not found + if (*buf == '\0') return False; // not found + if (*buf == '\r' && *(buf+1) == '\n' && *(buf+2) == '\r') return False; // end of the headers => not found if (_strncasecmp(buf, "Transport:", 10) == 0) break; ++buf; } @@ -1350,35 +1350,69 @@ // Then, run through each of the fields, looking for ones we handle: char const* fields = buf + 10; while (*fields == ' ') ++fields; + + Boolean badFieldSeen = True; // until we learn otherwise + Boolean ttlSeen = False; Boolean clientPortSeen = False; Boolean interleavedSeen = False; char* field = strDupSize(fields); while (sscanf(fields, "%[^;\r\n]", field) == 1) { + badFieldSeen = True; // until we learn otherwise if (strcmp(field, "RTP/AVP/TCP") == 0) { + if (streamingMode != UNKNOWN) break; // more than one 'streaming mode' is not allowed + streamingMode = RTP_TCP; - } else if (strcmp(field, "RAW/RAW/UDP") == 0 || - strcmp(field, "MP2T/H2221/UDP") == 0) { + } else if (strcmp(field, "RTP/AVP") == 0 || strcmp(field, "RTP/AVP/SAVP") == 0) { + if (streamingMode != UNKNOWN) break; // more than one 'streaming mode' is not allowed + + streamingMode = RTP_UDP; + } else if (strcmp(field, "RAW/RAW/UDP") == 0 || strcmp(field, "MP2T/H2221/UDP") == 0) { + if (streamingMode != UNKNOWN) break; // more than one 'streaming mode' is not allowed + streamingMode = RAW_UDP; streamingModeString = strDup(field); } else if (_strncasecmp(field, "destination=", 12) == 0) { - delete[] destinationAddressStr; + if (destinationAddressStr != NULL) { // more than one "destination=" is not allowed + delete[] destinationAddressStr; destinationAddressStr = NULL; + break; + } + destinationAddressStr = strDup(field+12); - } else if (sscanf(field, "ttl%u", &ttl) == 1) { + } else if (sscanf(field, "ttl=%u", &ttl) == 1) { + if (ttlSeen) break; ttlSeen = True; + if (ttl > 0xFF) break; + destinationTTL = (u_int8_t)ttl; - } else if (sscanf(field, "client_port=%hu-%hu", &p1, &p2) == 2) { - clientRTPPortNum = p1; - clientRTCPPortNum = streamingMode == RAW_UDP ? 0 : p2; // ignore the second port number if the client asked for raw UDP - } else if (sscanf(field, "client_port=%hu", &p1) == 1) { - clientRTPPortNum = p1; - clientRTCPPortNum = streamingMode == RAW_UDP ? 0 : p1 + 1; + } else if (sscanf(field, "client_port=%u-%u", &p1, &p2) == 2) { + if (clientPortSeen) break; clientPortSeen = True; + if (p1 > 0xFFFF || p2 > 0xFFFF) break; + + clientRTPPortNum = (portNumBits)p1; + clientRTCPPortNum = streamingMode == RAW_UDP ? 0 : (portNumBits)p2; + // ignore the second port number if the client asked for raw UDP + } else if (sscanf(field, "client_port=%u", &p1) == 1) { + if (clientPortSeen) break; clientPortSeen = True; + if (p1 > 0xFFFF || (p1 == 0xFFFF && streamingMode != RAW_UDP)) break; + + clientRTPPortNum = (portNumBits)p1; + clientRTCPPortNum = streamingMode == RAW_UDP ? 0 : (portNumBits)(p1+1); } else if (sscanf(field, "interleaved=%u-%u", &rtpCid, &rtcpCid) == 2) { - rtpChannelId = (unsigned char)rtpCid; - rtcpChannelId = (unsigned char)rtcpCid; + if (interleavedSeen) break; interleavedSeen = True; + if (rtpCid > 0xFF || rtcpCid > 0xFF) break; + + rtpChannelId = (u_int8_t)rtpCid; + rtcpChannelId = (u_int8_t)rtcpCid; } + badFieldSeen = False; fields += strlen(field); while (*fields == ';' || *fields == ' ' || *fields == '\t') ++fields; // skip over separating ';' chars or whitespace if (*fields == '\0' || *fields == '\r' || *fields == '\n') break; } delete[] field; + + if (badFieldSeen) return False; + if (streamingMode == UNKNOWN) return False; // no 'streaming mode' was specified + + return True; } static Boolean parsePlayNowHeader(char const* buf) { @@ -1579,15 +1613,6 @@ } // ASSERT: subsession != NULL - void*& token = fStreamStates[trackNum].streamToken; // alias - if (token != NULL) { - // We already handled a "SETUP" for this track (to the same client), - // so stop any existing streaming of it, before we set it up again: - subsession->pauseStream(fOurSessionId, token); - fOurRTSPServer.unnoteTCPStreamingOnSocket(fStreamStates[trackNum].tcpSocketNum, this, trackNum); - subsession->deleteStream(fOurSessionId, token); - } - // Look for a "Transport:" header in the request string, to extract client parameters: StreamingMode streamingMode; char* streamingModeString = NULL; // set when RAW_UDP streaming is specified @@ -1595,13 +1620,16 @@ u_int8_t clientsDestinationTTL; portNumBits clientRTPPortNum, clientRTCPPortNum; unsigned char rtpChannelId, rtcpChannelId; - parseTransportHeader(fFullRequestStr, streamingMode, streamingModeString, - clientsDestinationAddressStr, clientsDestinationTTL, - clientRTPPortNum, clientRTCPPortNum, - rtpChannelId, rtcpChannelId); + if (!parseTransportHeader(fFullRequestStr, streamingMode, streamingModeString, + clientsDestinationAddressStr, clientsDestinationTTL, + clientRTPPortNum, clientRTCPPortNum, + rtpChannelId, rtcpChannelId)) { + ourClientConnection->handleCmd_unsupportedTransport(); + break; + } if ((streamingMode == RTP_TCP && rtpChannelId == 0xFF) || (streamingMode != RTP_TCP && ourClientConnection->fClientOutputSocket != ourClientConnection->fClientInputSocket)) { - // An anomolous situation, caused by a buggy client. Either: + // An anomalous situation, caused by a buggy client. Either: // 1/ TCP streaming was requested, but with no "interleaving=" fields. (QuickTime Player sometimes does this.), or // 2/ TCP streaming was not requested, but we're doing RTSP-over-HTTP tunneling (which implies TCP streaming). // In either case, we assume TCP streaming, and set the RTP and RTCP channel ids to proper values: @@ -1610,9 +1638,6 @@ } if (streamingMode == RTP_TCP) fTCPStreamIdCount += 2; - Port clientRTPPort(clientRTPPortNum); - Port clientRTCPPort(clientRTCPPortNum); - // Next, check whether a "Range:" or "x-playNow:" header is present in the request. // This isn't legal, but some clients do this to combine "SETUP" and "PLAY": double rangeStart = 0.0, rangeEnd = 0.0; @@ -1627,6 +1652,15 @@ fStreamAfterSETUP = False; } + void*& token = fStreamStates[trackNum].streamToken; // alias + if (token != NULL) { + // We already handled a "SETUP" for this track (to the same client), + // so stop any existing streaming of it, before we set it up again: + subsession->pauseStream(fOurSessionId, token); + fOurRTSPServer.unnoteTCPStreamingOnSocket(fStreamStates[trackNum].tcpSocketNum, this, trackNum); + subsession->deleteStream(fOurSessionId, token); + } + // Then, get server parameters from the 'subsession': if (streamingMode == RTP_TCP) { // Note that we'll be streaming over the RTSP TCP connection: @@ -1659,6 +1693,9 @@ struct sockaddr_storage sourceAddr; SOCKLEN_T namelen = sizeof sourceAddr; getsockname(ourClientConnection->fClientInputSocket, (struct sockaddr*)&sourceAddr, &namelen); + Port clientRTPPort(clientRTPPortNum); + Port clientRTCPPort(clientRTCPPortNum); + subsession->getStreamParameters(fOurSessionId, ourClientConnection->fClientAddr, clientRTPPort, clientRTCPPort, streamingMode == RTP_TCP @@ -1679,6 +1716,10 @@ } if (fIsMulticast) { switch (streamingMode) { + case UNKNOWN: { // shouldn't happen + ourClientConnection->handleCmd_unsupportedTransport(); + break; + } case RTP_UDP: { snprintf((char*)ourClientConnection->fResponseBuffer, sizeof ourClientConnection->fResponseBuffer, "RTSP/1.0 200 OK\r\n" @@ -1714,6 +1755,10 @@ } } else { switch (streamingMode) { + case UNKNOWN: { // shouldn't happen + ourClientConnection->handleCmd_unsupportedTransport(); + break; + } case RTP_UDP: { snprintf((char*)ourClientConnection->fResponseBuffer, sizeof ourClientConnection->fResponseBuffer, "RTSP/1.0 200 OK\r\n" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/include/MatroskaFile.hh new/live/liveMedia/include/MatroskaFile.hh --- old/live/liveMedia/include/MatroskaFile.hh 2026-06-01 11:12:14.000000000 +0200 +++ new/live/liveMedia/include/MatroskaFile.hh 2026-08-14 14:53:03.000000000 +0200 @@ -154,11 +154,11 @@ unsigned samplingFrequency; unsigned numChannels; char const* mimeType; - unsigned codecPrivateSize; + u_int32_t codecPrivateSize; u_int8_t* codecPrivate; Boolean codecPrivateUsesH264FormatForH265; // a hack specifically for H.265 video tracks Boolean codecIsOpus; // a hack for Opus audio - unsigned headerStrippedBytesSize; + u_int32_t headerStrippedBytesSize; u_int8_t* headerStrippedBytes; char const* colorSampling; char const* colorimetry; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/liveMedia/include/liveMedia_version.hh new/live/liveMedia/include/liveMedia_version.hh --- old/live/liveMedia/include/liveMedia_version.hh 2026-06-01 11:12:14.000000000 +0200 +++ new/live/liveMedia/include/liveMedia_version.hh 2026-08-14 14:53:03.000000000 +0200 @@ -19,8 +19,8 @@ #ifndef _LIVEMEDIA_VERSION_HH #define _LIVEMEDIA_VERSION_HH -#define LIVEMEDIA_LIBRARY_VERSION_STRING "2026.06.01" -#define LIVEMEDIA_LIBRARY_VERSION_INT 1780272000 +#define LIVEMEDIA_LIBRARY_VERSION_STRING "2026.08.14" +#define LIVEMEDIA_LIBRARY_VERSION_INT 1786665600 extern char const* const liveMediaLibraryVersionStr; extern int const liveMediaLibraryVersionInt; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/mediaServer/version.hh new/live/mediaServer/version.hh --- old/live/mediaServer/version.hh 2026-06-01 11:12:14.000000000 +0200 +++ new/live/mediaServer/version.hh 2026-08-14 14:53:03.000000000 +0200 @@ -20,6 +20,6 @@ #ifndef _MEDIA_SERVER_VERSION_HH #define _MEDIA_SERVER_VERSION_HH -#define MEDIA_SERVER_VERSION_STRING "1.13" +#define MEDIA_SERVER_VERSION_STRING "1.15" #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/live/testProgs/testRTSPClient.cpp new/live/testProgs/testRTSPClient.cpp --- old/live/testProgs/testRTSPClient.cpp 2026-06-01 11:12:14.000000000 +0200 +++ new/live/testProgs/testRTSPClient.cpp 2026-08-14 14:53:03.000000000 +0200 @@ -61,7 +61,7 @@ env << "\t(where each <rtsp-url-i> is a \"rtsp://\" URL)\n"; } -EventLoopWatchVariable eventLoopWatchVariable = 0; +EventLoopWatchVariable eventLoopWatchVariable(0); int main(int argc, char** argv) { // Begin by setting up our usage environment:
