diff --git a/MozillaFirefox.changes b/MozillaFirefox.changes index 74024be..2645ae9 100644 --- a/MozillaFirefox.changes +++ b/MozillaFirefox.changes @@ -1,3 +1,43 @@ +------------------------------------------------------------------- +Thu Jul 23 21:00:34 UTC 2020 - Wolfgang Rosenauer + +- Mozilla Firefox 79.0 + MFSA 2020-30 (bsc#1174538) + * CVE-2020-15652 (bmo#1634872) + Potential leak of redirect targets when loading scripts in a worker + * CVE-2020-6514 (bmo#1642792) + WebRTC data channel leaks internal address to peer + * CVE-2020-15655 (bmo#1645204) + Extension APIs could be used to bypass Same-Origin Policy + * CVE-2020-15653 (bmo#1521542) + Bypassing iframe sandbox when allowing popups + * CVE-2020-6463 (bmo#1635293) + Use-after-free in ANGLE gl::Texture::onUnbindAsSamplerTexture + * CVE-2020-15656 (bmo#1647293) + Type confusion for special arguments in IonMonkey + * CVE-2020-15658 (bmo#1637745) + Overriding file type when saving to disk + * CVE-2020-15657 (bmo#1644954) + DLL hijacking due to incorrect loading path + * CVE-2020-15654 (bmo#1648333) + Custom cursor can overlay user interface + * CVE-2020-15659 (bmo#1550133, bmo#1633880, bmo#1638856, + bmo#1643613, bmo#1644839, bmo#1645835, bmo#1646006, bmo#1646220, + bmo#1646787, bmo#1649347, bmo#1650811, bmo#1651678) + Memory safety bugs fixed in Firefox 79 +- updated dependency requirements: + * mozilla-nspr >= 4.26 + * mozilla-nss >= 3.54 + * rust >= 1.43 + * rust-cbindgen >= 0.14.3 +- removed obsolete patch + mozilla-bmo1463035.patch + +------------------------------------------------------------------- +Tue Jul 21 21:31:20 UTC 2020 - Wolfgang Rosenauer + +- fixed syntax issue in desktop file (boo#1174360) + ------------------------------------------------------------------- Fri Jul 17 15:07:45 UTC 2020 - Wolfgang Rosenauer diff --git a/MozillaFirefox.desktop b/MozillaFirefox.desktop index abab405..df572e2 100644 --- a/MozillaFirefox.desktop +++ b/MozillaFirefox.desktop @@ -15,7 +15,7 @@ Actions=new-window;PrivateBrowsing;ProfileManager [Desktop Action new-window] Name=New Window -Exec==%EXEC --new-windows %u +Exec=%EXEC --new-window %u [Desktop Action PrivateBrowsing] Name=New Private Browsing Window diff --git a/MozillaFirefox.spec b/MozillaFirefox.spec index 95bb5fa..76c882d 100644 --- a/MozillaFirefox.spec +++ b/MozillaFirefox.spec @@ -25,9 +25,9 @@ # orig_suffix b3 # major 69 # mainver %major.99 -%define major 78 -%define mainver %major.0.2 -%define orig_version 78.0.2 +%define major 79 +%define mainver %major.0 +%define orig_version 79.0 %define orig_suffix %{nil} %define update_channel release %define branding 1 @@ -88,15 +88,15 @@ BuildRequires: gcc9-c++ %else BuildRequires: gcc-c++ %endif -BuildRequires: cargo >= 1.41 +BuildRequires: cargo >= 1.43 BuildRequires: libXcomposite-devel BuildRequires: libcurl-devel BuildRequires: libidl-devel BuildRequires: libiw-devel BuildRequires: libproxy-devel BuildRequires: makeinfo -BuildRequires: mozilla-nspr-devel >= 4.25 -BuildRequires: mozilla-nss-devel >= 3.53.1 +BuildRequires: mozilla-nspr-devel >= 4.26 +BuildRequires: mozilla-nss-devel >= 3.54 BuildRequires: nasm >= 2.14 BuildRequires: nodejs10 >= 10.21.0 BuildRequires: python-devel @@ -107,8 +107,8 @@ BuildRequires: python36 BuildRequires: python2-xml BuildRequires: python3 >= 3.5 %endif -BuildRequires: rust >= 1.41 -BuildRequires: rust-cbindgen >= 0.14.1 +BuildRequires: rust >= 1.43 +BuildRequires: rust-cbindgen >= 0.14.3 BuildRequires: unzip BuildRequires: update-desktop-files BuildRequires: xorg-x11-libXt-devel @@ -186,7 +186,6 @@ Patch1: mozilla-nongnome-proxies.patch Patch2: mozilla-kde.patch Patch3: mozilla-ntlm-full-path.patch Patch4: mozilla-aarch64-startup-crash.patch -Patch5: mozilla-bmo1463035.patch Patch6: mozilla-sandbox-fips.patch Patch7: mozilla-fix-aarch64-libopus.patch Patch8: mozilla-disable-wasm-emulate-arm-unaligned-fp-access.patch @@ -326,7 +325,6 @@ cd $RPM_BUILD_DIR/%{srcname}-%{orig_version} %patch2 -p1 %patch3 -p1 %patch4 -p1 -%patch5 -p1 %patch6 -p1 %patch7 -p1 %patch8 -p1 diff --git a/firefox-78.0.2.source.tar.xz b/firefox-78.0.2.source.tar.xz deleted file mode 100644 index b746430..0000000 --- a/firefox-78.0.2.source.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1aa00ec6d40a771d525b867b175be28eda096becc745875bcceb133a985750fc -size 334406116 diff --git a/firefox-78.0.2.source.tar.xz.asc b/firefox-78.0.2.source.tar.xz.asc deleted file mode 100644 index 9585f1e..0000000 --- a/firefox-78.0.2.source.tar.xz.asc +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQIzBAABCgAdFiEECXsxMHeuYqAvhNpN8aZmj7t9Vy4FAl8GQvUACgkQ8aZmj7t9 -Vy7cCxAAhfHL3/7MG61pjS8Ns7CcPdSwQ0E81YtYNa6XIPCAgnl50bKANXfdsG1d -cQbGI2oTDRWQqH4Iq47lc5rJYQkSy68U8GKiCaPl+0d3/GeBoyrqM1mQd3xy/FTG -4JxJU2frX7ATB4mBbTw/zzfguETtKWa6Lciq4dqh1ujbg+dKRaoY0IOsf+XCMRLo -BG+m3wnn4s+h8il36DRq60c1Ne2awEJ5lrH6PyDm0nvLCqdiUgy0ZxaXUdVdeWCs -6K339udRXmlzI1HHvyN/lBkA272yOfzpTYYJl7XeW75IMep90t/mAlJ+9ksKrnBU -AByOA7JpjUuXNtGel3Fszkfwk2SujyXb4m3moDw3l4XfBqXZIB7iBUt4mTAHbpQx -zrNAWxVc0MXkyccvqfhUzOnCGYgrT6KNrn6VkTSfEv/c2fAX9IYIw+l/mQoJdMYx -OEYF5Jvbb4GMhrwHGTyjk6wUuhB7RTPfLOkyT0iRSh6PTEmKLVw/m4wYExrnPjL4 -3Rzf0OrSWxvpYSHyT7rWRuhy/Z6X11PMIWw2R+abmkx4cCWe7Df0sHBUlhrEPiRC -R+v8wfXVM0Xcip4EI/nriXvm/atar9L5c9N0whdW+FpgeF/KxSt5FZUk7R4I7BIG -ga8qdXpdNF7X2ie8bOtYylsm6r7eJSvDy/r6jkYJ2zhpPvDYXsQ= -=dKzY ------END PGP SIGNATURE----- diff --git a/firefox-79.0.source.tar.xz b/firefox-79.0.source.tar.xz new file mode 100644 index 0000000..a80229d --- /dev/null +++ b/firefox-79.0.source.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12a922855914ec6b4d4f06a4ac58bc549aca6bdafd3722d68a3d709a935e5713 +size 333220776 diff --git a/firefox-79.0.source.tar.xz.asc b/firefox-79.0.source.tar.xz.asc new file mode 100644 index 0000000..8d4db8b --- /dev/null +++ b/firefox-79.0.source.tar.xz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEECXsxMHeuYqAvhNpN8aZmj7t9Vy4FAl8WILAACgkQ8aZmj7t9 +Vy6pRg/+J6hr1Ky1odA+zPM1IWpPo4jl57vhic9+GjmW+/PFL37IbgzQd+YityrL +uY6f/y3iHnqJ/wMAJekiq7MclpWXrno2g15Rjmkd3euwcaph0cTHscWojJWddvCl +OmClCvklpfgvpkLqaX1yDTrGS4+d61a60+h8pS4trAeX0atFLGPYIyY6cGHae1m1 +Xubmgak0lZEKcER0efQyTSXJJ2KFwJ35QkVNE6L76zahBSNK/Nr3sfrABxBNVZnI +R/Jhp5dnayeQfyCEDRlMYss8Cxh3YyG2/seKmFi8TVlJhuO0L2ay9TammmFpQp0c +iv5MC/FzxBZ9EK4Y0dBNHlLO457NIHpjtXoTu6nP4S7murt+CAPzjI704r9e4GDX +l+m3/2hWIwPc5EvTyUsFCdBJEkzeSL97woebcQkPMUNMRvjxxGtTjdsJHAoy/LNr +m/2vIev62hBlWKlk3g5CeM4yw4uNJ7AXPe87ZCtAKjppLjTRtRnuQhMeLHt4W2tv +J9EHttFsjTij+tx3iGshJKoIF1+MTQlrKrto9BhYPd4IT2lWoxnHFktHx37awhtZ +ghLVVbAcXMeonqFf//Rta7eEz1bJYZN1Dcl6xROq9GGTX+QEAYobesI81RjMs8TY +lNahX8/4D1kaz5Knp2CYX0iBYfPxic5tFwZ2xqd8pwsbDzPrSNg= +=SxfO +-----END PGP SIGNATURE----- diff --git a/firefox.1 b/firefox.1 index 6b38688..1faaf2a 100644 --- a/firefox.1 +++ b/firefox.1 @@ -60,7 +60,7 @@ Open new instance, not a new window in running instance. \fB\-\-UILocale\fR \fIlocale\fR Start with \fIlocale\fR resources as UI Locale. .TP -\fB\-\-save\-mode\fR +\fB\-\-safe\-mode\fR Disables extensions and themes for this session. .TP \fB\-\-headless\fR diff --git a/l10n-78.0.2.tar.xz b/l10n-78.0.2.tar.xz deleted file mode 100644 index a3dbab7..0000000 --- a/l10n-78.0.2.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2323c7ecf0b413f31b4c15164f7998e44a75637a5a40cdbfb7be8bc80622d33d -size 52194856 diff --git a/l10n-79.0.tar.xz b/l10n-79.0.tar.xz new file mode 100644 index 0000000..d5a8e1e --- /dev/null +++ b/l10n-79.0.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc9f77a4742b9e2e293f869ed5fd726f27a5b14975d7a77ec25e600fc9a98c9a +size 52406032 diff --git a/mozilla-bmo1463035.patch b/mozilla-bmo1463035.patch deleted file mode 100644 index c468376..0000000 --- a/mozilla-bmo1463035.patch +++ /dev/null @@ -1,76 +0,0 @@ - -# HG changeset patch -# User Mike Hommey -# Date 1526871862 -32400 -# Node ID 94f21505ff13cd089f7129cd24927cf8b31a0f43 -# Parent 0b7e1398ca2e15e27da93144ba9fb30db38367b1 -Bug 1463035 - Remove MOZ_SIGNAL_TRAMPOLINE. r?darchons - -For some reason, GNU as is not happy with the assembly generated after -bug 1238661 anymore on Debian armel. - -OTOH, as mentioned in bug 1238661 comment 4, we actually don't need this -workaround anymore, so let's just kill it. - -diff --git a/mozglue/baseprofiler/core/platform-linux-android.cpp b/mozglue/baseprofiler/core/platform-linux-android.cpp ---- a/mozglue/baseprofiler/core/platform-linux-android.cpp -+++ b/mozglue/baseprofiler/core/platform-linux-android.cpp -@@ -55,17 +55,16 @@ - #ifdef __GLIBC__ - # include // backtrace, backtrace_symbols - #endif // def __GLIBC__ - #include // index - #include - #include - - #include "prenv.h" --#include "mozilla/LinuxSignal.h" - #include "mozilla/PodOperations.h" - #include "mozilla/DebugOnly.h" - - #include - #include - - using namespace mozilla; - -@@ -266,17 +265,17 @@ Sampler::Sampler(PSLockRef aLock) - - // NOTE: We don't initialize LUL here, instead initializing it in - // SamplerThread's constructor. This is because with the - // profiler_suspend_and_sample_thread entry point, we want to be able to - // sample without waiting for LUL to be initialized. - - // Request profiling signals. - struct sigaction sa; -- sa.sa_sigaction = MOZ_SIGNAL_TRAMPOLINE(SigprofHandler); -+ sa.sa_sigaction = SigprofHandler; - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_RESTART | SA_SIGINFO; - if (sigaction(SIGPROF, &sa, &mOldSigprofHandler) != 0) { - MOZ_CRASH("Error installing SIGPROF handler in the profiler"); - } - } - - void Sampler::Disable(PSLockRef aLock) { -diff --git a/tools/profiler/core/platform-linux-android.cpp b/tools/profiler/core/platform-linux-android.cpp ---- a/tools/profiler/core/platform-linux-android.cpp -+++ b/tools/profiler/core/platform-linux-android.cpp -@@ -258,17 +258,17 @@ Sampler::Sampler(PSLockRef aLock) - - // NOTE: We don't initialize LUL here, instead initializing it in - // SamplerThread's constructor. This is because with the - // profiler_suspend_and_sample_thread entry point, we want to be able to - // sample without waiting for LUL to be initialized. - - // Request profiling signals. - struct sigaction sa; -- sa.sa_sigaction = MOZ_SIGNAL_TRAMPOLINE(SigprofHandler); -+ sa.sa_sigaction = SigprofHandler; - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_RESTART | SA_SIGINFO; - if (sigaction(SIGPROF, &sa, &mOldSigprofHandler) != 0) { - MOZ_CRASH("Error installing SIGPROF handler in the profiler"); - } - } - - void Sampler::Disable(PSLockRef aLock) { diff --git a/mozilla-kde.patch b/mozilla-kde.patch index 4223410..00227f2 100644 --- a/mozilla-kde.patch +++ b/mozilla-kde.patch @@ -3,7 +3,7 @@ # Date 1559294891 -7200 # Fri May 31 11:28:11 2019 +0200 # Node ID c2aa7198fb925e7fde96abf65b6f68b9b755f112 -# Parent aa58e8c70d1448a08407c6c191ea8b76d61e8bf6 +# Parent 43647626f7204e312a4e38cac0414a461b06667f Description: Add KDE integration to Firefox (toolkit parts) Author: Wolfgang Rosenauer Author: Lubos Lunak @@ -31,7 +31,7 @@ diff --git a/modules/libpref/Preferences.cpp b/modules/libpref/Preferences.cpp #ifdef MOZ_MEMORY # include "mozmemory.h" #endif -@@ -4566,25 +4567,37 @@ nsresult Preferences::InitInitialObjects +@@ -4570,25 +4571,37 @@ nsresult Preferences::InitInitialObjects // application pref files for backwards compatibility. static const char* specialFiles[] = { #if defined(XP_MACOSX) @@ -69,7 +69,7 @@ diff --git a/modules/libpref/Preferences.cpp b/modules/libpref/Preferences.cpp // Load jar:$app/omni.jar!/defaults/preferences/*.js // or jar:$gre/omni.jar!/defaults/preferences/*.js. -@@ -4630,17 +4643,17 @@ nsresult Preferences::InitInitialObjects +@@ -4634,17 +4647,17 @@ nsresult Preferences::InitInitialObjects } nsCOMPtr path = do_QueryInterface(elem); @@ -91,7 +91,7 @@ diff --git a/modules/libpref/Preferences.cpp b/modules/libpref/Preferences.cpp diff --git a/modules/libpref/moz.build b/modules/libpref/moz.build --- a/modules/libpref/moz.build +++ b/modules/libpref/moz.build -@@ -114,16 +114,20 @@ EXPORTS.mozilla += [ +@@ -117,16 +117,20 @@ EXPORTS.mozilla += [ ] EXPORTS.mozilla += sorted(['!' + g for g in gen_h]) @@ -106,12 +106,12 @@ diff --git a/modules/libpref/moz.build b/modules/libpref/moz.build + gen_all_tuple = tuple(gen_h + gen_cpp + gen_rs) - GENERATED_FILES += [gen_all_tuple] - - static_pref_list = GENERATED_FILES[gen_all_tuple] - static_pref_list.script = 'init/generate_static_pref_list.py:emit_code' - static_pref_list.inputs = ['init/StaticPrefList.yaml'] + GeneratedFile(*gen_all_tuple, script='init/generate_static_pref_list.py', + entry_point='emit_code', inputs=['init/StaticPrefList.yaml']) + PYTHON_UNITTEST_MANIFESTS += [ + 'test/python.ini', + ] diff --git a/python/mozbuild/mozpack/chrome/flags.py b/python/mozbuild/mozpack/chrome/flags.py --- a/python/mozbuild/mozpack/chrome/flags.py +++ b/python/mozbuild/mozpack/chrome/flags.py @@ -356,7 +356,7 @@ diff --git a/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp b/toolkit/sy diff --git a/toolkit/xre/moz.build b/toolkit/xre/moz.build --- a/toolkit/xre/moz.build +++ b/toolkit/xre/moz.build -@@ -88,17 +88,19 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'co +@@ -90,17 +90,19 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'co '../components/printingui', ] elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'uikit': @@ -1293,7 +1293,7 @@ diff --git a/uriloader/exthandler/unix/nsOSHelperAppService.cpp b/uriloader/exth diff --git a/widget/gtk/moz.build b/widget/gtk/moz.build --- a/widget/gtk/moz.build +++ b/widget/gtk/moz.build -@@ -131,16 +131,17 @@ include('/ipc/chromium/chromium-config.m +@@ -133,16 +133,17 @@ include('/ipc/chromium/chromium-config.m FINAL_LIBRARY = 'xul' diff --git a/mozilla-pipewire-0-3.patch b/mozilla-pipewire-0-3.patch index 4b9eb84..6cb41b6 100644 --- a/mozilla-pipewire-0-3.patch +++ b/mozilla-pipewire-0-3.patch @@ -1,8 +1,15 @@ +# HG changeset patch +# Parent f530b1587cd1c0a79c34f91a9690c4cc4c33ac31 + diff --git a/config/system-headers.mozbuild b/config/system-headers.mozbuild -index 2081d0c683a4..641133bf1ea4 100644 --- a/config/system-headers.mozbuild +++ b/config/system-headers.mozbuild -@@ -314,6 +314,7 @@ system_headers = [ +@@ -309,16 +309,17 @@ system_headers = [ + 'gdk/gdkkeysyms.h', + 'gdk/gdkprivate.h', + 'gdk/gdkwayland.h', + 'gdk/gdkx.h', + 'gdk-pixbuf/gdk-pixbuf.h', 'Gestalt.h', 'getopt.h', 'gio/gio.h', @@ -10,7 +17,17 @@ index 2081d0c683a4..641133bf1ea4 100644 'glibconfig.h', 'glib.h', 'glib-object.h', -@@ -607,6 +608,7 @@ system_headers = [ + 'glob.h', + 'gmodule.h', + 'gnome.h', + 'gnu/libc-version.h', + 'gps.h', +@@ -602,16 +603,17 @@ system_headers = [ + 'pango/pangoxft.h', + 'pascal.h', + 'Patches.h', + 'Path.h', + 'pcfs/pc_dir.h', 'Pgenerr.h', 'PGenErr.h', 'Ph.h', @@ -18,11 +35,20 @@ index 2081d0c683a4..641133bf1ea4 100644 'pixman.h', 'pk11func.h', 'pk11pqg.h', + 'pk11priv.h', + 'pk11pub.h', + 'pk11sdr.h', + 'pkcs11f.h', + 'pkcs11.h', diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn b/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn -index ba885217b3ba..201d3b755221 100644 --- a/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn +++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn -@@ -158,7 +158,7 @@ if (rtc_include_tests) { +@@ -153,17 +153,17 @@ if (rtc_include_tests) { + "../../test:test_support", + ] + } + } + if (is_linux) { if (rtc_use_pipewire) { pkg_config("pipewire") { @@ -31,12 +57,21 @@ index ba885217b3ba..201d3b755221 100644 defines = [ "WEBRTC_USE_PIPEWIRE" ] } + + pkg_config("gio") { + packages = [ + "gio-2.0", + "gio-unix-2.0", diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build -index 90b40431c7e4..d844aa79d591 100644 --- a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build +++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build -@@ -194,6 +194,30 @@ if CONFIG["OS_TARGET"] == "Linux": - "/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc" +@@ -289,16 +289,40 @@ if CONFIG["OS_TARGET"] == "WINNT": + "/media/webrtc/trunk/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.cc", + "/media/webrtc/trunk/webrtc/modules/desktop_capture/win/screen_capturer_win_magnifier.cc", + "/media/webrtc/trunk/webrtc/modules/desktop_capture/win/win_shared.cc", + "/media/webrtc/trunk/webrtc/modules/desktop_capture/win/window_capture_utils.cc", + "/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_win.cc", + "/media/webrtc/trunk/webrtc/modules/desktop_capture/window_finder_win.cc" ] +# PipeWire specific files @@ -66,11 +101,20 @@ index 90b40431c7e4..d844aa79d591 100644 if CONFIG["OS_TARGET"] == "NetBSD": DEFINES["USE_X11"] = "1" + DEFINES["WEBRTC_BSD"] = True + DEFINES["WEBRTC_POSIX"] = True + DEFINES["_FILE_OFFSET_BITS"] = "64" + + OS_LIBS += [ diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h -index 1eb8ead26efa..316468eed1fc 100644 --- a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h +++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h -@@ -141,7 +141,7 @@ class DesktopCaptureOptions { +@@ -136,15 +136,15 @@ class DesktopCaptureOptions { + #if defined(USE_X11) + bool use_update_notifications_ = false; + #else + bool use_update_notifications_ = true; + #endif bool disable_effects_ = true; bool detect_updated_region_ = false; #if defined(WEBRTC_USE_PIPEWIRE) @@ -79,11 +123,18 @@ index 1eb8ead26efa..316468eed1fc 100644 #endif }; + } // namespace webrtc + + #endif // MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURE_OPTIONS_H_ diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc -index 379341c833de..76349f1fbd4d 100644 --- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc +++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc -@@ -15,8 +15,11 @@ +@@ -10,18 +10,21 @@ + + #include "modules/desktop_capture/linux/base_capturer_pipewire.h" + + #include + #include #include #include @@ -97,34 +148,36 @@ index 379341c833de..76349f1fbd4d 100644 #include #include -@@ -36,31 +39,36 @@ const char kSessionInterfaceName[] = "org.freedesktop.portal.Session"; + + #include "modules/desktop_capture/desktop_capture_options.h" + #include "modules/desktop_capture/desktop_capturer.h" + #include "rtc_base/checks.h" + #include "rtc_base/logging.h" +@@ -31,181 +34,158 @@ namespace webrtc { + const char kDesktopBusName[] = "org.freedesktop.portal.Desktop"; + const char kDesktopObjectPath[] = "/org/freedesktop/portal/desktop"; + const char kDesktopRequestObjectPath[] = + "/org/freedesktop/portal/desktop/request"; + const char kSessionInterfaceName[] = "org.freedesktop.portal.Session"; const char kRequestInterfaceName[] = "org.freedesktop.portal.Request"; const char kScreenCastInterfaceName[] = "org.freedesktop.portal.ScreenCast"; --// static ++ + // static -void BaseCapturerPipeWire::OnStateChanged(void* data, - pw_remote_state old_state, - pw_remote_state state, - const char* error_message) { - BaseCapturerPipeWire* that = static_cast(data); - RTC_DCHECK(that); - -- switch (state) { -- case PW_REMOTE_STATE_ERROR: -- RTC_LOG(LS_ERROR) << "PipeWire remote state error: " << error_message; -- break; -- case PW_REMOTE_STATE_CONNECTED: -- RTC_LOG(LS_INFO) << "PipeWire remote state: connected."; -- that->CreateReceivingStream(); -- break; -- case PW_REMOTE_STATE_CONNECTING: -- RTC_LOG(LS_INFO) << "PipeWire remote state: connecting."; -+// static +void BaseCapturerPipeWire::SyncDmaBuf(int fd, uint64_t start_or_end) { + struct dma_buf_sync sync = { 0 }; + + sync.flags = start_or_end | DMA_BUF_SYNC_READ; -+ + +- switch (state) { +- case PW_REMOTE_STATE_ERROR: +- RTC_LOG(LS_ERROR) << "PipeWire remote state error: " << error_message; + while(true) { + int ret; + ret = ioctl (fd, DMA_BUF_IOCTL_SYNC, &sync); @@ -133,15 +186,22 @@ index 379341c833de..76349f1fbd4d 100644 + } else if (ret == -1) { + RTC_LOG(LS_ERROR) << "Failed to synchronize DMA buffer: " << g_strerror(errno); break; -- case PW_REMOTE_STATE_UNCONNECTED: -- RTC_LOG(LS_INFO) << "PipeWire remote state: unconnected."; +- case PW_REMOTE_STATE_CONNECTED: +- RTC_LOG(LS_INFO) << "PipeWire remote state: connected."; +- that->CreateReceivingStream(); + } else { break; +- case PW_REMOTE_STATE_CONNECTING: +- RTC_LOG(LS_INFO) << "PipeWire remote state: connecting."; +- break; +- case PW_REMOTE_STATE_UNCONNECTED: +- RTC_LOG(LS_INFO) << "PipeWire remote state: unconnected."; +- break; + } } } -+// static + // static +void BaseCapturerPipeWire::OnCoreError(void *data, + uint32_t id, + int seq, @@ -150,23 +210,28 @@ index 379341c833de..76349f1fbd4d 100644 + RTC_LOG(LS_ERROR) << "core error: " << message; +} + - // static ++// static void BaseCapturerPipeWire::OnStreamStateChanged(void* data, pw_stream_state old_state, -@@ -73,76 +81,54 @@ void BaseCapturerPipeWire::OnStreamStateChanged(void* data, + pw_stream_state state, + const char* error_message) { + BaseCapturerPipeWire* that = static_cast(data); + RTC_DCHECK(that); + + switch (state) { case PW_STREAM_STATE_ERROR: RTC_LOG(LS_ERROR) << "PipeWire stream state error: " << error_message; break; - case PW_STREAM_STATE_CONFIGURE: - pw_stream_set_active(that->pw_stream_, true); - break; -- case PW_STREAM_STATE_UNCONNECTED: -- case PW_STREAM_STATE_CONNECTING: ++ case PW_STREAM_STATE_PAUSED: ++ case PW_STREAM_STATE_STREAMING: + case PW_STREAM_STATE_UNCONNECTED: + case PW_STREAM_STATE_CONNECTING: - case PW_STREAM_STATE_READY: - case PW_STREAM_STATE_PAUSED: - case PW_STREAM_STATE_STREAMING: -+ case PW_STREAM_STATE_UNCONNECTED: -+ case PW_STREAM_STATE_CONNECTING: +- case PW_STREAM_STATE_PAUSED: +- case PW_STREAM_STATE_STREAMING: break; } } @@ -256,20 +321,20 @@ index 379341c833de..76349f1fbd4d 100644 } // static -@@ -150,15 +136,25 @@ void BaseCapturerPipeWire::OnStreamProcess(void* data) { + void BaseCapturerPipeWire::OnStreamProcess(void* data) { BaseCapturerPipeWire* that = static_cast(data); RTC_DCHECK(that); - pw_buffer* buf = nullptr; + struct pw_buffer *next_buffer; + struct pw_buffer *buffer = nullptr; -+ + +- if (!(buf = pw_stream_dequeue_buffer(that->pw_stream_))) { + next_buffer = pw_stream_dequeue_buffer(that->pw_stream_); + while (next_buffer) { + buffer = next_buffer; + next_buffer = pw_stream_dequeue_buffer(that->pw_stream_); - -- if (!(buf = pw_stream_dequeue_buffer(that->pw_stream_))) { ++ + if (next_buffer) + pw_stream_queue_buffer (that->pw_stream_, buffer); + } @@ -286,7 +351,10 @@ index 379341c833de..76349f1fbd4d 100644 } BaseCapturerPipeWire::BaseCapturerPipeWire(CaptureSourceType source_type) -@@ -169,38 +165,22 @@ BaseCapturerPipeWire::~BaseCapturerPipeWire() { + : capture_source_type_(source_type) {} + + BaseCapturerPipeWire::~BaseCapturerPipeWire() { + if (pw_main_loop_) { pw_thread_loop_stop(pw_main_loop_); } @@ -329,16 +397,22 @@ index 379341c833de..76349f1fbd4d 100644 if (start_request_signal_id_) { g_dbus_connection_signal_unsubscribe(connection_, start_request_signal_id_); } -@@ -250,27 +230,35 @@ void BaseCapturerPipeWire::InitPortal() { + if (sources_request_signal_id_) { + g_dbus_connection_signal_unsubscribe(connection_, + sources_request_signal_id_); + } + if (session_request_signal_id_) { +@@ -245,142 +225,220 @@ void BaseCapturerPipeWire::InitPortal() + kDesktopBusName, kDesktopObjectPath, kScreenCastInterfaceName, + /*cancellable=*/nullptr, + reinterpret_cast(OnProxyRequested), this); + } + void BaseCapturerPipeWire::InitPipeWire() { pw_init(/*argc=*/nullptr, /*argc=*/nullptr); - pw_loop_ = pw_loop_new(/*properties=*/nullptr); - pw_main_loop_ = pw_thread_loop_new(pw_loop_, "pipewire-main-loop"); -- -- pw_core_ = pw_core_new(pw_loop_, /*properties=*/nullptr); -- pw_core_type_ = pw_core_get_type(pw_core_); -- pw_remote_ = pw_remote_new(pw_core_, nullptr, /*user_data_size=*/0); + pw_main_loop_ = pw_thread_loop_new("pipewire-main-loop", nullptr); + pw_context_ = pw_context_new(pw_thread_loop_get_loop(pw_main_loop_), nullptr, 0); + if (!pw_context_) { @@ -346,6 +420,10 @@ index 379341c833de..76349f1fbd4d 100644 + return; + } +- pw_core_ = pw_core_new(pw_loop_, /*properties=*/nullptr); +- pw_core_type_ = pw_core_get_type(pw_core_); +- pw_remote_ = pw_remote_new(pw_core_, nullptr, /*user_data_size=*/0); +- - InitPipeWireTypes(); + pw_core_ = pw_context_connect(pw_context_, nullptr, 0); + if (!pw_core_) { @@ -378,7 +456,7 @@ index 379341c833de..76349f1fbd4d 100644 if (pw_thread_loop_start(pw_main_loop_) < 0) { RTC_LOG(LS_ERROR) << "Failed to start main PipeWire loop"; -@@ -278,81 +266,132 @@ void BaseCapturerPipeWire::InitPipeWire() { + portal_init_failed_ = true; } } @@ -391,19 +469,20 @@ index 379341c833de..76349f1fbd4d 100644 - spa_type_format_video_map(map, &pw_type_->format_video); - spa_type_video_format_map(map, &pw_type_->video_format); -} -- --void BaseCapturerPipeWire::CreateReceivingStream() { +pw_stream* BaseCapturerPipeWire::CreateReceivingStream() { - spa_rectangle pwMinScreenBounds = spa_rectangle{1, 1}; ++ spa_rectangle pwMinScreenBounds = spa_rectangle{1, 1}; ++ spa_rectangle pwMaxScreenBounds = spa_rectangle{INT32_MAX, INT32_MAX}; + +-void BaseCapturerPipeWire::CreateReceivingStream() { +- spa_rectangle pwMinScreenBounds = spa_rectangle{1, 1}; - spa_rectangle pwScreenBounds = - spa_rectangle{static_cast(desktop_size_.width()), - static_cast(desktop_size_.height())}; -+ spa_rectangle pwMaxScreenBounds = spa_rectangle{INT32_MAX, INT32_MAX}; ++ auto stream = pw_stream_new(pw_core_, "webrtc-pipewire-stream", nullptr); - spa_fraction pwFrameRateMin = spa_fraction{0, 1}; - spa_fraction pwFrameRateMax = spa_fraction{60, 1}; -+ auto stream = pw_stream_new(pw_core_, "webrtc-pipewire-stream", nullptr); - +- - pw_properties* reuseProps = pw_properties_new("pipewire.client.reuse", "1", - /*end of varargs*/ nullptr); - pw_stream_ = pw_stream_new(pw_remote_, "webrtc-consume-stream", reuseProps); @@ -439,12 +518,11 @@ index 379341c833de..76349f1fbd4d 100644 - // min and max values and it is undecided (u) to allow negotiation - ":", pw_type_->format_video.max_framerate, "Fru", &pwFrameRateMax, 2, - &pwFrameRateMin, &pwFrameRateMax)); -- -- pw_stream_add_listener(pw_stream_, &spa_stream_listener_, &pw_stream_events_, -- this); + const spa_pod* params[2]; + spa_pod_builder builder = SPA_POD_BUILDER_INIT(buffer, sizeof (buffer)); -+ + +- pw_stream_add_listener(pw_stream_, &spa_stream_listener_, &pw_stream_events_, +- this); + params[0] = reinterpret_cast(spa_pod_builder_add_object(&builder, + SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat, + SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_video), @@ -494,13 +572,13 @@ index 379341c833de..76349f1fbd4d 100644 + RTC_LOG(LS_ERROR) << "Failed to mmap the memory: " << std::strerror(errno); + return; + } -+ + +- if (!(src = spaBuffer->datas[0].data)) { + src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t); + } else if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) { + int fd; + fd = spaBuffer->datas[0].fd; - -- if (!(src = spaBuffer->datas[0].data)) { ++ + map = static_cast(mmap( + nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset, + PROT_READ, MAP_PRIVATE, fd, 0)); @@ -569,14 +647,27 @@ index 379341c833de..76349f1fbd4d 100644 if (srcStride != (desktop_size_.width() * kBytesPerPixel)) { RTC_LOG(LS_ERROR) << "Got buffer with stride different from screen stride: " << srcStride -@@ -361,21 +400,40 @@ void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) { + << " != " << (desktop_size_.width() * kBytesPerPixel); + portal_init_failed_ = true; return; } - if (!current_frame_) { - current_frame_ = static_cast(malloc(maxSize)); +- } +- RTC_DCHECK(current_frame_ != nullptr); + dst = current_frame_.get(); -+ + +- // If both sides decided to go with the RGBx format we need to convert it to +- // BGRx to match color format expected by WebRTC. +- if (spa_video_format_->format == pw_type_->video_format.RGBx) { +- uint8_t* tempFrame = static_cast(malloc(maxSize)); +- std::memcpy(tempFrame, src, maxSize); +- ConvertRGBxToBGRx(tempFrame, maxSize); +- std::memcpy(current_frame_, tempFrame, maxSize); +- free(tempFrame); +- } else { +- std::memcpy(current_frame_, src, maxSize); + // Adjust source content based on crop video position + if (video_crop_size_initialized_ && + (video_crop->region.position.y + video_crop_size_.height() <= desktop_size_.height())) { @@ -602,19 +693,8 @@ index 379341c833de..76349f1fbd4d 100644 + } + src += srcStride - xOffset; + dst += dstStride; - } -- RTC_DCHECK(current_frame_ != nullptr); - -- // If both sides decided to go with the RGBx format we need to convert it to -- // BGRx to match color format expected by WebRTC. -- if (spa_video_format_->format == pw_type_->video_format.RGBx) { -- uint8_t* tempFrame = static_cast(malloc(maxSize)); -- std::memcpy(tempFrame, src, maxSize); -- ConvertRGBxToBGRx(tempFrame, maxSize); -- std::memcpy(current_frame_, tempFrame, maxSize); -- free(tempFrame); -- } else { -- std::memcpy(current_frame_, src, maxSize); ++ } ++ + if (map) { + if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) { + SyncDmaBuf(spaBuffer->datas[0].fd, DMA_BUF_SYNC_END); @@ -623,7 +703,17 @@ index 379341c833de..76349f1fbd4d 100644 } } -@@ -725,10 +783,7 @@ void BaseCapturerPipeWire::OnStartRequestResponseSignal( + void BaseCapturerPipeWire::ConvertRGBxToBGRx(uint8_t* frame, uint32_t size) { + // Change color format for KDE KWin which uses RGBx and not BGRx + for (uint32_t i = 0; i < size; i += 4) { + uint8_t tempR = frame[i]; + uint8_t tempB = frame[i + 2]; +@@ -720,20 +778,17 @@ void BaseCapturerPipeWire::OnStartReques + guint32 stream_id; + gint32 width; + gint32 height; + GVariant* options; + g_variant_get(variant, "(u@a{sv})", &stream_id, &options); RTC_DCHECK(options != nullptr); @@ -635,7 +725,17 @@ index 379341c833de..76349f1fbd4d 100644 g_variant_unref(options); g_variant_unref(variant); } -@@ -813,10 +868,15 @@ void BaseCapturerPipeWire::CaptureFrame() { + } + g_variant_iter_free(iter); + g_variant_unref(response_data); + + that->OpenPipeWireRemote(); +@@ -808,20 +863,25 @@ void BaseCapturerPipeWire::CaptureFrame( + return; + } + + if (!current_frame_) { + callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr); return; } @@ -654,7 +754,17 @@ index 379341c833de..76349f1fbd4d 100644 if (!result) { callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr); return; -@@ -837,4 +897,22 @@ bool BaseCapturerPipeWire::SelectSource(SourceId id) { + } + callback_->OnCaptureResult(Result::SUCCESS, std::move(result)); + } + + bool BaseCapturerPipeWire::GetSourceList(SourceList* sources) { +@@ -832,9 +892,27 @@ bool BaseCapturerPipeWire::GetSourceList + return true; + } + + bool BaseCapturerPipeWire::SelectSource(SourceId id) { + // Screen selection is handled by the xdg-desktop-portal. return true; } @@ -678,10 +788,14 @@ index 379341c833de..76349f1fbd4d 100644 + } // namespace webrtc diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h -index 56b101acbaa6..de54157d1a2a 100644 --- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h +++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h -@@ -22,17 +22,13 @@ +@@ -17,99 +17,103 @@ + #include + + #include "modules/desktop_capture/desktop_capture_options.h" + #include "modules/desktop_capture/desktop_capturer.h" + #include "rtc_base/constructormagic.h" namespace webrtc { @@ -704,7 +818,10 @@ index 56b101acbaa6..de54157d1a2a 100644 explicit BaseCapturerPipeWire(CaptureSourceType source_type); ~BaseCapturerPipeWire() override; -@@ -43,28 +39,32 @@ class BaseCapturerPipeWire : public DesktopCapturer { + + // DesktopCapturer interface. + void Start(Callback* delegate) override; + void CaptureFrame() override; bool GetSourceList(SourceList* sources) override; bool SelectSource(SourceId id) override; @@ -745,7 +862,13 @@ index 56b101acbaa6..de54157d1a2a 100644 // <-- end of PipeWire types -@@ -78,33 +78,37 @@ class BaseCapturerPipeWire : public DesktopCapturer { + GDBusConnection* connection_ = nullptr; + GDBusProxy* proxy_ = nullptr; + gchar* portal_handle_ = nullptr; + gchar* session_handle_ = nullptr; + gchar* sources_handle_ = nullptr; + gchar* start_handle_ = nullptr; + guint session_request_signal_id_ = 0; guint sources_request_signal_id_ = 0; guint start_request_signal_id_ = 0; @@ -792,11 +915,20 @@ index 56b101acbaa6..de54157d1a2a 100644 static void OnStreamProcess(void* data); static void OnNewBuffer(void* data, uint32_t id); + guint SetupRequestResponseSignal(const gchar* object_path, + GDBusSignalCallback callback); + + static void OnProxyRequested(GObject* object, + GAsyncResult* result, diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc -index 26956fc67dc8..3813d697bb38 100644 --- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc +++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc -@@ -15,7 +15,7 @@ +@@ -10,17 +10,17 @@ + + #include "modules/desktop_capture/linux/screen_capturer_pipewire.h" + + #include + namespace webrtc { ScreenCapturerPipeWire::ScreenCapturerPipeWire() @@ -805,11 +937,20 @@ index 26956fc67dc8..3813d697bb38 100644 ScreenCapturerPipeWire::~ScreenCapturerPipeWire() {} // static + std::unique_ptr + ScreenCapturerPipeWire::CreateRawScreenCapturer( + const DesktopCaptureOptions& options) { + return std::make_unique(); + } diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc -index 35436475cb4d..c43a1f1a0c4e 100644 --- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc +++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc -@@ -15,7 +15,7 @@ +@@ -10,17 +10,17 @@ + + #include "modules/desktop_capture/linux/window_capturer_pipewire.h" + + #include + namespace webrtc { WindowCapturerPipeWire::WindowCapturerPipeWire() @@ -818,11 +959,20 @@ index 35436475cb4d..c43a1f1a0c4e 100644 WindowCapturerPipeWire::~WindowCapturerPipeWire() {} // static + std::unique_ptr + WindowCapturerPipeWire::CreateRawWindowCapturer( + const DesktopCaptureOptions& options) { + return std::make_unique(); + } diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc -index cf8a9dd0e0db..d27fab8d28d9 100644 --- a/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc +++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc -@@ -26,7 +26,7 @@ std::unique_ptr DesktopCapturer::CreateRawScreenCapturer( +@@ -21,17 +21,17 @@ + + namespace webrtc { + + // static + std::unique_ptr DesktopCapturer::CreateRawScreenCapturer( const DesktopCaptureOptions& options) { #if defined(WEBRTC_USE_PIPEWIRE) if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) { @@ -831,11 +981,20 @@ index cf8a9dd0e0db..d27fab8d28d9 100644 } #endif // defined(WEBRTC_USE_PIPEWIRE) + #if defined(USE_X11) + return ScreenCapturerX11::CreateRawScreenCapturer(options); + #endif // defined(USE_X11) + + return nullptr; diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc -index 82359e50c2db..bb9724cf7cc2 100644 --- a/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc +++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc -@@ -26,7 +26,7 @@ std::unique_ptr DesktopCapturer::CreateRawWindowCapturer( +@@ -21,17 +21,17 @@ + + namespace webrtc { + + // static + std::unique_ptr DesktopCapturer::CreateRawWindowCapturer( const DesktopCaptureOptions& options) { #if defined(WEBRTC_USE_PIPEWIRE) if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) { @@ -844,3 +1003,8 @@ index 82359e50c2db..bb9724cf7cc2 100644 } #endif // defined(WEBRTC_USE_PIPEWIRE) + #if defined(USE_X11) + return WindowCapturerX11::CreateRawWindowCapturer(options); + #endif // defined(USE_X11) + + return nullptr; diff --git a/tar_stamps b/tar_stamps index 48bce0f..e337032 100644 --- a/tar_stamps +++ b/tar_stamps @@ -1,11 +1,11 @@ PRODUCT="firefox" CHANNEL="release" -VERSION="78.0.2" +VERSION="79.0" VERSION_SUFFIX="" -PREV_VERSION="78.0.1" +PREV_VERSION="78.0.2" PREV_VERSION_SUFFIX="" #SKIP_LOCALES="" # Uncomment to skip l10n and compare-locales-generation RELEASE_REPO="https://hg.mozilla.org/releases/mozilla-release" -RELEASE_TAG="e56adbbfe01c2443bae35e3d6f34867e36c3828e" -RELEASE_TIMESTAMP="20200708170202" +RELEASE_TAG="df3ed76cf46b23c9b658cd5be4cdd4162d86f736" +RELEASE_TIMESTAMP="20200720193547"