MFH: r557394 r557754 r557767 r558100
www/firefox: update to 84.0 - Correct patch for powerpc64 [1] Changes: https://www.mozilla.org/firefox/84.0/releasenotes/ Submitted by: pkubaj
This commit is contained in:
parent
aeb6452ba7
commit
c7357eee0c
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/branches/2020Q4/; revision=558102
@ -2,12 +2,12 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PORTNAME= firefox
|
||||
DISTVERSION= 83.0
|
||||
PORTREVISION= 3
|
||||
DISTVERSION= 84.0
|
||||
PORTREVISION= 2
|
||||
PORTEPOCH= 2
|
||||
CATEGORIES= www
|
||||
MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \
|
||||
MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build2/source
|
||||
MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build3/source
|
||||
DISTFILES= ${DISTNAME}.source${EXTRACT_SUFX}
|
||||
|
||||
MAINTAINER= gecko@FreeBSD.org
|
||||
|
@ -1,3 +1,3 @@
|
||||
TIMESTAMP = 1605204503
|
||||
SHA256 (firefox-83.0.source.tar.xz) = d69e84e8b8449f828683d274c24e03095858362bfed21b08bdd7fe715eea5398
|
||||
SIZE (firefox-83.0.source.tar.xz) = 351331940
|
||||
TIMESTAMP = 1607733349
|
||||
SHA256 (firefox-84.0.source.tar.xz) = 23273ef0165b243f5d0908c38e7854d38070282c9b526e8d93b7503cd5f69138
|
||||
SIZE (firefox-84.0.source.tar.xz) = 366395172
|
||||
|
@ -2,34 +2,34 @@ diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.confi
|
||||
index 855214a..1e91d51 100644
|
||||
--- build/moz.configure/init.configure
|
||||
+++ build/moz.configure/init.configure
|
||||
@@ -240,6 +240,7 @@ option(env='VIRTUALENV_NAME', nargs=1, default='init_p
|
||||
@imports(_from='mozbuild.pythonutil', _import='find_python3_executable')
|
||||
@imports(_from='mozbuild.pythonutil', _import='python_executable_version')
|
||||
@imports(_from='six', _import='ensure_text')
|
||||
+@imports(_from='__builtin__', _import='KeyError')
|
||||
@@ -238,6 +238,7 @@ option(
|
||||
@imports(_from="mozbuild.pythonutil", _import="find_python3_executable")
|
||||
@imports(_from="mozbuild.pythonutil", _import="python_executable_version")
|
||||
@imports(_from="six", _import="ensure_text")
|
||||
+@imports(_from="__builtin__", _import="KeyError")
|
||||
def virtualenv_python3(env_python, virtualenv_name, build_env, mozconfig, help):
|
||||
# Avoid re-executing python when running configure --help.
|
||||
if help:
|
||||
@@ -273,6 +274,12 @@ def virtualenv_python3(env_python, virtualenv_name, bu
|
||||
python = mozconfig['vars']['added']['PYTHON3']
|
||||
elif 'PYTHON3' in mozconfig['vars']['modified']:
|
||||
python = mozconfig['vars']['modified']['PYTHON3'][1]
|
||||
+ for i in ('env', 'vars'):
|
||||
+ for j in ('added', 'modified'):
|
||||
@@ -271,6 +272,12 @@ def virtualenv_python3(env_python, virtualenv_name, bu
|
||||
python = mozconfig["vars"]["added"]["PYTHON3"]
|
||||
elif "PYTHON3" in mozconfig["vars"]["modified"]:
|
||||
python = mozconfig["vars"]["modified"]["PYTHON3"][1]
|
||||
+ for i in ("env", "vars"):
|
||||
+ for j in ("added", "modified"):
|
||||
+ try:
|
||||
+ del mozconfig[i][j]['PYTHON3']
|
||||
+ del mozconfig[i][j]["PYTHON3"]
|
||||
+ except KeyError:
|
||||
+ pass
|
||||
|
||||
log.debug("python3: executable from configuration: %r" % python)
|
||||
|
||||
@@ -358,7 +365,10 @@ def virtualenv_python3(env_python, virtualenv_name, bu
|
||||
sys.executable, manager.python_path))
|
||||
log.info('Re-executing in the virtualenv')
|
||||
@@ -364,7 +371,10 @@ def virtualenv_python3(env_python, virtualenv_name, bu
|
||||
)
|
||||
log.info("Re-executing in the virtualenv")
|
||||
if env_python:
|
||||
- del os.environ['PYTHON3']
|
||||
- del os.environ["PYTHON3"]
|
||||
+ try:
|
||||
+ del os.environ['PYTHON3']
|
||||
+ del os.environ["PYTHON3"]
|
||||
+ except KeyError:
|
||||
+ pass
|
||||
# Homebrew on macOS will change Python's sys.executable to a custom
|
||||
|
@ -1,788 +0,0 @@
|
||||
commit cc6e7ab13380
|
||||
Author: Jed Davis <jld@mozilla.com>
|
||||
Date: Thu Oct 22 21:23:32 2020 +0000
|
||||
|
||||
Bug 1440203 - Support memfd_create in IPC shared memory. r=glandium
|
||||
|
||||
This commit also allows `memfd_create` in the seccomp-bpf policy for all
|
||||
process types.
|
||||
|
||||
`memfd_create` is an API added in Linux 3.17 (and adopted by FreeBSD
|
||||
for the upcoming version 13) for creating anonymous shared memory
|
||||
not connected to any filesystem. Supporting it means that sandboxed
|
||||
child processes on Linux can create shared memory directly instead of
|
||||
messaging a broker, which is unavoidably slower, and it should avoid
|
||||
the problems we'd been seeing with overly small `/dev/shm` in container
|
||||
environments (which were causing serious problems for using Firefox for
|
||||
automated testing of frontend projects).
|
||||
|
||||
`memfd_create` also introduces the related operation of file seals:
|
||||
irrevocably preventing types of modifications to a file. Unfortunately,
|
||||
the most useful one, `F_SEAL_WRITE`, can't be relied on; see the large
|
||||
comment in `SharedMemory:ReadOnlyCopy` for details. So we still use
|
||||
the applicable seals as defense in depth, but read-only copies are
|
||||
implemented on Linux by using procfs (and see the comments on the
|
||||
`ReadOnlyCopy` function in `shared_memory_posix.cc` for the subtleties
|
||||
there).
|
||||
|
||||
There's also a FreeBSD implementation, using `cap_rights_limit` for
|
||||
read-only copies, if the build host is new enough to have the
|
||||
`memfd_create` function.
|
||||
|
||||
The support code for Android, which doesn't support shm_open and can't
|
||||
use the memfd backend because of issues with its SELinux policy (see bug
|
||||
1670277), has been reorganized to reflect that we'll always use its own
|
||||
API, ashmem, in that case.
|
||||
|
||||
Differential Revision: https://phabricator.services.mozilla.com/D90605
|
||||
---
|
||||
build/moz.configure/headers.configure | 8 +
|
||||
config/system-headers.mozbuild | 5 +
|
||||
ipc/chromium/src/base/linux_memfd_defs.h | 69 +++++
|
||||
ipc/chromium/src/base/shared_memory.h | 3 +-
|
||||
ipc/chromium/src/base/shared_memory_posix.cc | 428 +++++++++++++++++++++------
|
||||
ipc/gtest/TestSharedMemory.cpp | 46 +++
|
||||
security/sandbox/linux/SandboxFilter.cpp | 9 +-
|
||||
7 files changed, 472 insertions(+), 96 deletions(-)
|
||||
|
||||
diff --git build/moz.configure/headers.configure build/moz.configure/headers.configure
|
||||
index 9445f10a4d53..0f4455d8eeea 100644
|
||||
--- build/moz.configure/headers.configure
|
||||
+++ build/moz.configure/headers.configure
|
||||
@@ -65,6 +65,14 @@ check_headers(
|
||||
'byteswap.h',
|
||||
)
|
||||
|
||||
+# memfd_create(2) -- Note that older versions of the Linux man-pages
|
||||
+# project incorrectly cite <sys/memfd.h>, which doesn't exist; this
|
||||
+# was fixed in the man-pages-5.00 release.
|
||||
+set_define('HAVE_MEMFD_CREATE',
|
||||
+ try_compile(includes=['sys/mman.h'],
|
||||
+ body='memfd_create("", 0);',
|
||||
+ check_msg='for memfd_create in sys/mman.h'))
|
||||
+
|
||||
# TODO: Move these checks to file specific to --enable-project=js.
|
||||
have_perf_event_h = check_header('linux/perf_event.h',
|
||||
when=building_linux)
|
||||
diff --git config/system-headers.mozbuild config/system-headers.mozbuild
|
||||
index 1dfd3f0a48b8..3c355e3f1d71 100644
|
||||
--- config/system-headers.mozbuild
|
||||
+++ config/system-headers.mozbuild
|
||||
@@ -1352,5 +1352,10 @@ if CONFIG['OS_TARGET'] == 'Linux' and CONFIG['CPU_ARCH'].startswith('mips'):
|
||||
'sys/cachectl.h',
|
||||
]
|
||||
|
||||
+if CONFIG['OS_TARGET'] == 'FreeBSD':
|
||||
+ system_headers += [
|
||||
+ 'sys/capsicum.h',
|
||||
+ ]
|
||||
+
|
||||
if CONFIG['MOZ_APP_SYSTEM_HEADERS']:
|
||||
include("../" + CONFIG['MOZ_BUILD_APP'] + "/app-system-headers.mozbuild")
|
||||
diff --git ipc/chromium/src/base/linux_memfd_defs.h ipc/chromium/src/base/linux_memfd_defs.h
|
||||
new file mode 100644
|
||||
index 000000000000..f5b0de1de853
|
||||
--- /dev/null
|
||||
+++ ipc/chromium/src/base/linux_memfd_defs.h
|
||||
@@ -0,0 +1,69 @@
|
||||
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
||||
+/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
+
|
||||
+#ifndef BASE_LINUX_MEMFD_DEFS_H
|
||||
+#define BASE_LINUX_MEMFD_DEFS_H
|
||||
+
|
||||
+#include <sys/syscall.h>
|
||||
+
|
||||
+// glibc before 2.27 didn't have a memfd_create wrapper, and if the
|
||||
+// build system is old enough then it won't have the syscall number
|
||||
+// and various related constants either.
|
||||
+
|
||||
+#if defined(__x86_64__)
|
||||
+# define MEMFD_CREATE_NR 319
|
||||
+#elif defined(__i386__)
|
||||
+# define MEMFD_CREATE_NR 356
|
||||
+#elif defined(__aarch64__)
|
||||
+# define MEMFD_CREATE_NR 279
|
||||
+#elif defined(__arm__)
|
||||
+# define MEMFD_CREATE_NR 385
|
||||
+#elif defined(__powerpc__)
|
||||
+# define MEMFD_CREATE_NR 360
|
||||
+#elif defined(__s390__)
|
||||
+# define MEMFD_CREATE_NR 350
|
||||
+#elif defined(__mips__)
|
||||
+# include <sgidefs.h>
|
||||
+# if _MIPS_SIM == _MIPS_SIM_ABI32
|
||||
+# define MEMFD_CREATE_NR 4354
|
||||
+# elif _MIPS_SIM == _MIPS_SIM_ABI64
|
||||
+# define MEMFD_CREATE_NR 5314
|
||||
+# elif _MIPS_SIM == _MIPS_SIM_NABI32
|
||||
+# define MEMFD_CREATE_NR 6318
|
||||
+# endif // mips subarch
|
||||
+#endif // arch
|
||||
+
|
||||
+#ifdef MEMFD_CREATE_NR
|
||||
+# ifdef SYS_memfd_create
|
||||
+static_assert(MEMFD_CREATE_NR == SYS_memfd_create,
|
||||
+ "MEMFD_CREATE_NR should match the actual SYS_memfd_create value");
|
||||
+# else // defined here but not in system headers
|
||||
+# define SYS_memfd_create MEMFD_CREATE_NR
|
||||
+# endif
|
||||
+#endif
|
||||
+
|
||||
+#ifndef MFD_CLOEXEC
|
||||
+# define MFD_CLOEXEC 0x0001U
|
||||
+# define MFD_ALLOW_SEALING 0x0002U
|
||||
+#endif
|
||||
+
|
||||
+#ifndef F_ADD_SEALS
|
||||
+# ifndef F_LINUX_SPECIFIC_BASE
|
||||
+# define F_LINUX_SPECIFIC_BASE 1024
|
||||
+# endif
|
||||
+# define F_ADD_SEALS (F_LINUX_SPECIFIC_BASE + 9)
|
||||
+# define F_GET_SEALS (F_LINUX_SPECIFIC_BASE + 10)
|
||||
+# define F_SEAL_SEAL 0x0001 /* prevent further seals from being set */
|
||||
+# define F_SEAL_SHRINK 0x0002 /* prevent file from shrinking */
|
||||
+# define F_SEAL_GROW 0x0004 /* prevent file from growing */
|
||||
+# define F_SEAL_WRITE 0x0008 /* prevent writes */
|
||||
+#endif
|
||||
+
|
||||
+#ifndef F_SEAL_FUTURE_WRITE
|
||||
+# define F_SEAL_FUTURE_WRITE 0x0010
|
||||
+#endif
|
||||
+
|
||||
+#endif // BASE_LINUX_MEMFD_DEFS_H
|
||||
diff --git ipc/chromium/src/base/shared_memory.h ipc/chromium/src/base/shared_memory.h
|
||||
index 93372f4ab333..49d614164a0b 100644
|
||||
--- ipc/chromium/src/base/shared_memory.h
|
||||
+++ ipc/chromium/src/base/shared_memory.h
|
||||
@@ -216,8 +216,9 @@ class SharedMemory {
|
||||
// If true indicates this came from an external source so needs extra checks
|
||||
// before being mapped.
|
||||
bool external_section_ = false;
|
||||
-#elif defined(OS_POSIX)
|
||||
+#elif defined(OS_POSIX) && !defined(ANDROID)
|
||||
mozilla::UniqueFileHandle frozen_file_;
|
||||
+ bool is_memfd_ = false;
|
||||
#endif
|
||||
bool read_only_ = false;
|
||||
bool freezeable_ = false;
|
||||
diff --git ipc/chromium/src/base/shared_memory_posix.cc ipc/chromium/src/base/shared_memory_posix.cc
|
||||
index d5f734ac91b8..e36805aedb89 100644
|
||||
--- ipc/chromium/src/base/shared_memory_posix.cc
|
||||
+++ ipc/chromium/src/base/shared_memory_posix.cc
|
||||
@@ -16,6 +16,18 @@
|
||||
# include "mozilla/Ashmem.h"
|
||||
#endif
|
||||
|
||||
+#ifdef OS_LINUX
|
||||
+# include "linux_memfd_defs.h"
|
||||
+#endif
|
||||
+
|
||||
+#ifdef __FreeBSD__
|
||||
+# include <sys/capsicum.h>
|
||||
+#endif
|
||||
+
|
||||
+#ifdef MOZ_VALGRIND
|
||||
+# include <valgrind/valgrind.h>
|
||||
+#endif
|
||||
+
|
||||
#include "base/eintr_wrapper.h"
|
||||
#include "base/logging.h"
|
||||
#include "base/string_util.h"
|
||||
@@ -46,11 +58,14 @@ SharedMemory::~SharedMemory() {
|
||||
|
||||
bool SharedMemory::SetHandle(SharedMemoryHandle handle, bool read_only) {
|
||||
DCHECK(!mapped_file_);
|
||||
+#ifndef ANDROID
|
||||
DCHECK(!frozen_file_);
|
||||
+#endif
|
||||
|
||||
freezeable_ = false;
|
||||
mapped_file_.reset(handle.fd);
|
||||
read_only_ = read_only;
|
||||
+ // is_memfd_ only matters for freezing, which isn't possible
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -62,11 +77,187 @@ bool SharedMemory::IsHandleValid(const SharedMemoryHandle& handle) {
|
||||
// static
|
||||
SharedMemoryHandle SharedMemory::NULLHandle() { return SharedMemoryHandle(); }
|
||||
|
||||
-// static
|
||||
+#ifdef ANDROID
|
||||
+
|
||||
+// Android has its own shared memory API, ashmem. It doesn't support
|
||||
+// POSIX shm_open, and the memfd support (see below) also doesn't work
|
||||
+// because its SELinux policy prevents the procfs operations we'd use
|
||||
+// (see bug 1670277 for more details).
|
||||
+
|
||||
bool SharedMemory::AppendPosixShmPrefix(std::string* str, pid_t pid) {
|
||||
-#if defined(ANDROID)
|
||||
return false;
|
||||
-#else
|
||||
+}
|
||||
+
|
||||
+bool SharedMemory::CreateInternal(size_t size, bool freezeable) {
|
||||
+ read_only_ = false;
|
||||
+
|
||||
+ DCHECK(size > 0);
|
||||
+ DCHECK(!mapped_file_);
|
||||
+
|
||||
+ int fd = mozilla::android::ashmem_create(nullptr, size);
|
||||
+ if (fd < 0) {
|
||||
+ CHROMIUM_LOG(WARNING) << "failed to open shm: " << strerror(errno);
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ mapped_file_.reset(fd);
|
||||
+ max_size_ = size;
|
||||
+ freezeable_ = freezeable;
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+bool SharedMemory::ReadOnlyCopy(SharedMemory* ro_out) {
|
||||
+ DCHECK(mapped_file_);
|
||||
+ DCHECK(!read_only_);
|
||||
+ CHECK(freezeable_);
|
||||
+
|
||||
+ if (ro_out == this) {
|
||||
+ DCHECK(!memory_);
|
||||
+ }
|
||||
+
|
||||
+ if (mozilla::android::ashmem_setProt(mapped_file_.get(), PROT_READ) != 0) {
|
||||
+ CHROMIUM_LOG(WARNING) << "failed to set ashmem read-only: "
|
||||
+ << strerror(errno);
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ mozilla::UniqueFileHandle ro_file = std::move(mapped_file_);
|
||||
+
|
||||
+ freezeable_ = false;
|
||||
+ ro_out->Close();
|
||||
+ ro_out->mapped_file_ = std::move(ro_file);
|
||||
+ ro_out->max_size_ = max_size_;
|
||||
+ ro_out->read_only_ = true;
|
||||
+ ro_out->freezeable_ = false;
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+#else // not Android
|
||||
+
|
||||
+// memfd_create is a nonstandard interface for creating anonymous
|
||||
+// shared memory accessible as a file descriptor but not tied to any
|
||||
+// filesystem. It first appeared in Linux 3.17, and was adopted by
|
||||
+// FreeBSD in version 13.
|
||||
+
|
||||
+# if !defined(HAVE_MEMFD_CREATE) && defined(OS_LINUX) && \
|
||||
+ defined(SYS_memfd_create)
|
||||
+
|
||||
+// Older libc versions (e.g., glibc before 2.27) don't have the
|
||||
+// wrapper, but we can supply our own; see `linux_memfd_defs.h`.
|
||||
+
|
||||
+static int memfd_create(const char* name, unsigned int flags) {
|
||||
+ return syscall(SYS_memfd_create, name, flags);
|
||||
+}
|
||||
+
|
||||
+# define HAVE_MEMFD_CREATE 1
|
||||
+# endif
|
||||
+
|
||||
+// memfd supports having "seals" applied to the file, to prevent
|
||||
+// various types of changes (which apply to all fds referencing the
|
||||
+// file). Unfortunately, we can't rely on F_SEAL_WRITE to implement
|
||||
+// Freeze(); see the comments in ReadOnlyCopy() below.
|
||||
+//
|
||||
+// Instead, to prevent a child process from regaining write access to
|
||||
+// a read-only copy, the OS must also provide a way to remove write
|
||||
+// permissions at the file descriptor level. This next section
|
||||
+// attempts to accomplish that.
|
||||
+
|
||||
+# ifdef HAVE_MEMFD_CREATE
|
||||
+# ifdef XP_LINUX
|
||||
+# define USE_MEMFD_CREATE 1
|
||||
+
|
||||
+// To create a read-only duplicate of an fd, we can use procfs; the
|
||||
+// same operation could restore write access, but sandboxing prevents
|
||||
+// child processes from accessing /proc.
|
||||
+//
|
||||
+// (Note: if this ever changes to not use /proc, also reconsider how
|
||||
+// and if HaveMemfd should check whether this works.)
|
||||
+
|
||||
+static int DupReadOnly(int fd) {
|
||||
+ std::string path = StringPrintf("/proc/self/fd/%d", fd);
|
||||
+ // procfs opens probably won't EINTR, but checking for it can't hurt
|
||||
+ return HANDLE_EINTR(open(path.c_str(), O_RDONLY | O_CLOEXEC));
|
||||
+}
|
||||
+
|
||||
+# elif defined(__FreeBSD__)
|
||||
+# define USE_MEMFD_CREATE 1
|
||||
+
|
||||
+// FreeBSD's Capsicum framework allows irrevocably restricting the
|
||||
+// operations permitted on a file descriptor.
|
||||
+
|
||||
+static int DupReadOnly(int fd) {
|
||||
+ int rofd = dup(fd);
|
||||
+ if (rofd < 0) {
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ cap_rights_t rights;
|
||||
+ cap_rights_init(&rights, CAP_FSTAT, CAP_MMAP_R);
|
||||
+ if (cap_rights_limit(rofd, &rights) < 0) {
|
||||
+ int err = errno;
|
||||
+ close(rofd);
|
||||
+ errno = err;
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return rofd;
|
||||
+}
|
||||
+
|
||||
+# else // unhandled OS
|
||||
+# warning "OS has memfd_create but no DupReadOnly implementation"
|
||||
+# endif // OS selection
|
||||
+# endif // HAVE_MEMFD_CREATE
|
||||
+
|
||||
+// Runtime detection for memfd support.
|
||||
+static bool HaveMemfd() {
|
||||
+# ifdef USE_MEMFD_CREATE
|
||||
+ static const bool kHave = [] {
|
||||
+ mozilla::UniqueFileHandle fd(
|
||||
+ memfd_create("mozilla-ipc-test", MFD_CLOEXEC | MFD_ALLOW_SEALING));
|
||||
+ if (!fd) {
|
||||
+ DCHECK_EQ(errno, ENOSYS);
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ // Verify that DupReadOnly works; on Linux it's known to fail if:
|
||||
+ //
|
||||
+ // * SELinux assigns the memfd a type for which this process's
|
||||
+ // domain doesn't have "open" permission; this is always the
|
||||
+ // case on Android but could occur on desktop as well
|
||||
+ //
|
||||
+ // * /proc (used by the DupReadOnly implementation) isn't mounted,
|
||||
+ // which is a configuration that the Tor Browser project is
|
||||
+ // interested in as a way to reduce fingerprinting risk
|
||||
+ //
|
||||
+ // Sandboxed processes on Linux also can't use it if sandboxing
|
||||
+ // has already been started, but that's expected. It should be
|
||||
+ // safe for sandboxed child processes to use memfd even if an
|
||||
+ // unsandboxed process couldn't freeze them, because freezing
|
||||
+ // isn't allowed (or meaningful) for memory created by another
|
||||
+ // process.
|
||||
+
|
||||
+ if (!PR_GetEnv("MOZ_SANDBOXED")) {
|
||||
+ mozilla::UniqueFileHandle rofd(DupReadOnly(fd.get()));
|
||||
+ if (!rofd) {
|
||||
+ CHROMIUM_LOG(WARNING) << "read-only dup failed (" << strerror(errno)
|
||||
+ << "); not using memfd";
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+ return true;
|
||||
+ }();
|
||||
+ return kHave;
|
||||
+# else
|
||||
+ return false;
|
||||
+# endif // USE_MEMFD_CREATE
|
||||
+}
|
||||
+
|
||||
+// static
|
||||
+bool SharedMemory::AppendPosixShmPrefix(std::string* str, pid_t pid) {
|
||||
+ if (HaveMemfd()) {
|
||||
+ return false;
|
||||
+ }
|
||||
*str += '/';
|
||||
# ifdef OS_LINUX
|
||||
// The Snap package environment doesn't provide a private /dev/shm
|
||||
@@ -90,7 +281,6 @@ bool SharedMemory::AppendPosixShmPrefix(std::string* str, pid_t pid) {
|
||||
// enough for this.
|
||||
StringAppendF(str, "org.mozilla.ipc.%d.", static_cast<int>(pid));
|
||||
return true;
|
||||
-#endif // !ANDROID
|
||||
}
|
||||
|
||||
bool SharedMemory::CreateInternal(size_t size, bool freezeable) {
|
||||
@@ -102,104 +292,118 @@ bool SharedMemory::CreateInternal(size_t size, bool freezeable) {
|
||||
|
||||
mozilla::UniqueFileHandle fd;
|
||||
mozilla::UniqueFileHandle frozen_fd;
|
||||
- bool needs_truncate = true;
|
||||
+ bool is_memfd = false;
|
||||
+
|
||||
+# ifdef USE_MEMFD_CREATE
|
||||
+ if (HaveMemfd()) {
|
||||
+ const unsigned flags = MFD_CLOEXEC | (freezeable ? MFD_ALLOW_SEALING : 0);
|
||||
+ fd.reset(memfd_create("mozilla-ipc", flags));
|
||||
+ if (!fd) {
|
||||
+ // In general it's too late to fall back here -- in a sandboxed
|
||||
+ // child process, shm_open is already blocked. And it shouldn't
|
||||
+ // be necessary.
|
||||
+ CHROMIUM_LOG(WARNING) << "failed to create memfd: " << strerror(errno);
|
||||
+ return false;
|
||||
+ }
|
||||
+ is_memfd = true;
|
||||
+ if (freezeable) {
|
||||
+ frozen_fd.reset(DupReadOnly(fd.get()));
|
||||
+ if (!frozen_fd) {
|
||||
+ CHROMIUM_LOG(WARNING)
|
||||
+ << "failed to create read-only memfd: " << strerror(errno);
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+# endif
|
||||
|
||||
-#ifdef ANDROID
|
||||
- // Android has its own shared memory facility:
|
||||
- fd.reset(mozilla::android::ashmem_create(nullptr, size));
|
||||
if (!fd) {
|
||||
- CHROMIUM_LOG(WARNING) << "failed to open shm: " << strerror(errno);
|
||||
- return false;
|
||||
- }
|
||||
- needs_truncate = false;
|
||||
-#else
|
||||
- // Generic Unix: shm_open + shm_unlink
|
||||
- do {
|
||||
- // The names don't need to be unique, but it saves time if they
|
||||
- // usually are.
|
||||
- static mozilla::Atomic<size_t> sNameCounter;
|
||||
- std::string name;
|
||||
- CHECK(AppendPosixShmPrefix(&name, getpid()));
|
||||
- StringAppendF(&name, "%zu", sNameCounter++);
|
||||
- // O_EXCL means the names being predictable shouldn't be a problem.
|
||||
- fd.reset(
|
||||
- HANDLE_EINTR(shm_open(name.c_str(), O_RDWR | O_CREAT | O_EXCL, 0600)));
|
||||
- if (fd) {
|
||||
- if (freezeable) {
|
||||
- frozen_fd.reset(HANDLE_EINTR(shm_open(name.c_str(), O_RDONLY, 0400)));
|
||||
- if (!frozen_fd) {
|
||||
- int open_err = errno;
|
||||
- shm_unlink(name.c_str());
|
||||
- DLOG(FATAL) << "failed to re-open freezeable shm: "
|
||||
- << strerror(open_err);
|
||||
+ // Generic Unix: shm_open + shm_unlink
|
||||
+ do {
|
||||
+ // The names don't need to be unique, but it saves time if they
|
||||
+ // usually are.
|
||||
+ static mozilla::Atomic<size_t> sNameCounter;
|
||||
+ std::string name;
|
||||
+ CHECK(AppendPosixShmPrefix(&name, getpid()));
|
||||
+ StringAppendF(&name, "%zu", sNameCounter++);
|
||||
+ // O_EXCL means the names being predictable shouldn't be a problem.
|
||||
+ fd.reset(HANDLE_EINTR(
|
||||
+ shm_open(name.c_str(), O_RDWR | O_CREAT | O_EXCL, 0600)));
|
||||
+ if (fd) {
|
||||
+ if (freezeable) {
|
||||
+ frozen_fd.reset(HANDLE_EINTR(shm_open(name.c_str(), O_RDONLY, 0400)));
|
||||
+ if (!frozen_fd) {
|
||||
+ int open_err = errno;
|
||||
+ shm_unlink(name.c_str());
|
||||
+ DLOG(FATAL) << "failed to re-open freezeable shm: "
|
||||
+ << strerror(open_err);
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+ if (shm_unlink(name.c_str()) != 0) {
|
||||
+ // This shouldn't happen, but if it does: assume the file is
|
||||
+ // in fact leaked, and bail out now while it's still 0-length.
|
||||
+ DLOG(FATAL) << "failed to unlink shm: " << strerror(errno);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
- if (shm_unlink(name.c_str()) != 0) {
|
||||
- // This shouldn't happen, but if it does: assume the file is
|
||||
- // in fact leaked, and bail out now while it's still 0-length.
|
||||
- DLOG(FATAL) << "failed to unlink shm: " << strerror(errno);
|
||||
- return false;
|
||||
- }
|
||||
- }
|
||||
- } while (!fd && errno == EEXIST);
|
||||
-#endif
|
||||
+ } while (!fd && errno == EEXIST);
|
||||
+ }
|
||||
|
||||
if (!fd) {
|
||||
CHROMIUM_LOG(WARNING) << "failed to open shm: " << strerror(errno);
|
||||
return false;
|
||||
}
|
||||
|
||||
- if (needs_truncate) {
|
||||
-#if defined(HAVE_POSIX_FALLOCATE)
|
||||
- // Using posix_fallocate will ensure that there's actually space for this
|
||||
- // file. Otherwise we end up with a sparse file that can give SIGBUS if we
|
||||
- // run out of space while writing to it.
|
||||
- int rv;
|
||||
- {
|
||||
- // Avoid repeated interruptions of posix_fallocate by the profiler's
|
||||
- // SIGPROF sampling signal. Indicating "thread sleep" here means we'll
|
||||
- // get up to one interruption but not more. See bug 1658847 for more.
|
||||
- // This has to be scoped outside the HANDLE_RV_EINTR retry loop.
|
||||
- AUTO_PROFILER_THREAD_SLEEP;
|
||||
- rv = HANDLE_RV_EINTR(
|
||||
- posix_fallocate(fd.get(), 0, static_cast<off_t>(size)));
|
||||
- }
|
||||
- if (rv != 0) {
|
||||
- if (rv == EOPNOTSUPP || rv == EINVAL || rv == ENODEV) {
|
||||
- // Some filesystems have trouble with posix_fallocate. For now, we must
|
||||
- // fallback ftruncate and accept the allocation failures like we do
|
||||
- // without posix_fallocate.
|
||||
- // See https://bugzilla.mozilla.org/show_bug.cgi?id=1618914
|
||||
- int fallocate_errno = rv;
|
||||
- rv = HANDLE_EINTR(ftruncate(fd.get(), static_cast<off_t>(size)));
|
||||
- if (rv != 0) {
|
||||
- CHROMIUM_LOG(WARNING) << "fallocate failed to set shm size: "
|
||||
- << strerror(fallocate_errno);
|
||||
- CHROMIUM_LOG(WARNING)
|
||||
- << "ftruncate failed to set shm size: " << strerror(errno);
|
||||
- return false;
|
||||
- }
|
||||
- } else {
|
||||
+# if defined(HAVE_POSIX_FALLOCATE)
|
||||
+ // Using posix_fallocate will ensure that there's actually space for this
|
||||
+ // file. Otherwise we end up with a sparse file that can give SIGBUS if we
|
||||
+ // run out of space while writing to it.
|
||||
+ int rv;
|
||||
+ {
|
||||
+ // Avoid repeated interruptions of posix_fallocate by the profiler's
|
||||
+ // SIGPROF sampling signal. Indicating "thread sleep" here means we'll
|
||||
+ // get up to one interruption but not more. See bug 1658847 for more.
|
||||
+ // This has to be scoped outside the HANDLE_RV_EINTR retry loop.
|
||||
+ AUTO_PROFILER_THREAD_SLEEP;
|
||||
+ rv =
|
||||
+ HANDLE_RV_EINTR(posix_fallocate(fd.get(), 0, static_cast<off_t>(size)));
|
||||
+ }
|
||||
+ if (rv != 0) {
|
||||
+ if (rv == EOPNOTSUPP || rv == EINVAL || rv == ENODEV) {
|
||||
+ // Some filesystems have trouble with posix_fallocate. For now, we must
|
||||
+ // fallback ftruncate and accept the allocation failures like we do
|
||||
+ // without posix_fallocate.
|
||||
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=1618914
|
||||
+ int fallocate_errno = rv;
|
||||
+ rv = HANDLE_EINTR(ftruncate(fd.get(), static_cast<off_t>(size)));
|
||||
+ if (rv != 0) {
|
||||
+ CHROMIUM_LOG(WARNING) << "fallocate failed to set shm size: "
|
||||
+ << strerror(fallocate_errno);
|
||||
CHROMIUM_LOG(WARNING)
|
||||
- << "fallocate failed to set shm size: " << strerror(rv);
|
||||
+ << "ftruncate failed to set shm size: " << strerror(errno);
|
||||
return false;
|
||||
}
|
||||
- }
|
||||
-#else
|
||||
- int rv = HANDLE_EINTR(ftruncate(fd.get(), static_cast<off_t>(size)));
|
||||
- if (rv != 0) {
|
||||
+ } else {
|
||||
CHROMIUM_LOG(WARNING)
|
||||
- << "ftruncate failed to set shm size: " << strerror(errno);
|
||||
+ << "fallocate failed to set shm size: " << strerror(rv);
|
||||
return false;
|
||||
}
|
||||
-#endif
|
||||
}
|
||||
+# else
|
||||
+ int rv = HANDLE_EINTR(ftruncate(fd.get(), static_cast<off_t>(size)));
|
||||
+ if (rv != 0) {
|
||||
+ CHROMIUM_LOG(WARNING) << "ftruncate failed to set shm size: "
|
||||
+ << strerror(errno);
|
||||
+ return false;
|
||||
+ }
|
||||
+# endif
|
||||
|
||||
mapped_file_ = std::move(fd);
|
||||
frozen_file_ = std::move(frozen_fd);
|
||||
max_size_ = size;
|
||||
freezeable_ = freezeable;
|
||||
+ is_memfd_ = is_memfd;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -212,23 +416,63 @@ bool SharedMemory::ReadOnlyCopy(SharedMemory* ro_out) {
|
||||
DCHECK(!memory_);
|
||||
}
|
||||
|
||||
- mozilla::UniqueFileHandle ro_file;
|
||||
-#ifdef ANDROID
|
||||
- ro_file = std::move(mapped_file_);
|
||||
- if (mozilla::android::ashmem_setProt(ro_file.get(), PROT_READ) != 0) {
|
||||
- CHROMIUM_LOG(WARNING) << "failed to set ashmem read-only: "
|
||||
- << strerror(errno);
|
||||
- return false;
|
||||
+# ifdef USE_MEMFD_CREATE
|
||||
+# ifdef MOZ_VALGRIND
|
||||
+ // Valgrind allows memfd_create but doesn't understand F_ADD_SEALS.
|
||||
+ static const bool haveSeals = RUNNING_ON_VALGRIND == 0;
|
||||
+# else
|
||||
+ static const bool haveSeals = true;
|
||||
+# endif
|
||||
+ static const bool useSeals = !PR_GetEnv("MOZ_SHM_NO_SEALS");
|
||||
+ if (is_memfd_ && haveSeals && useSeals) {
|
||||
+ // Seals are added to the file as defense-in-depth. The primary
|
||||
+ // method of access control is creating a read-only fd (using
|
||||
+ // procfs in this case) and requiring that sandboxes processes not
|
||||
+ // have access to /proc/self/fd to regain write permission; this
|
||||
+ // is the same as with shm_open.
|
||||
+ //
|
||||
+ // Unfortunately, F_SEAL_WRITE is unreliable: if the process
|
||||
+ // forked while there was a writeable mapping, it will inherit a
|
||||
+ // copy of the mapping, which causes the seal to fail.
|
||||
+ //
|
||||
+ // (Also, in the future we may want to split this into separate
|
||||
+ // classes for mappings and shared memory handles, which would
|
||||
+ // complicate identifying the case where `F_SEAL_WRITE` would be
|
||||
+ // possible even in the absence of races with fork.)
|
||||
+ //
|
||||
+ // However, Linux 5.1 added F_SEAL_FUTURE_WRITE, which prevents
|
||||
+ // write operations afterwards, but existing writeable mappings
|
||||
+ // are unaffected (similar to ashmem protection semantics).
|
||||
+
|
||||
+ const int seals = F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL;
|
||||
+ int sealError = EINVAL;
|
||||
+
|
||||
+# ifdef F_SEAL_FUTURE_WRITE
|
||||
+ sealError =
|
||||
+ fcntl(mapped_file_.get(), F_ADD_SEALS, seals | F_SEAL_FUTURE_WRITE) == 0
|
||||
+ ? 0
|
||||
+ : errno;
|
||||
+# endif // F_SEAL_FUTURE_WRITE
|
||||
+ if (sealError == EINVAL) {
|
||||
+ sealError =
|
||||
+ fcntl(mapped_file_.get(), F_ADD_SEALS, seals) == 0 ? 0 : errno;
|
||||
+ }
|
||||
+ if (sealError != 0) {
|
||||
+ CHROMIUM_LOG(WARNING) << "failed to seal memfd: " << strerror(errno);
|
||||
+ return false;
|
||||
+ }
|
||||
}
|
||||
-#else
|
||||
+# else // !USE_MEMFD_CREATE
|
||||
+ DCHECK(!is_memfd_);
|
||||
+# endif
|
||||
+
|
||||
DCHECK(frozen_file_);
|
||||
+ DCHECK(mapped_file_);
|
||||
mapped_file_ = nullptr;
|
||||
- ro_file = std::move(frozen_file_);
|
||||
-#endif
|
||||
+ mozilla::UniqueFileHandle ro_file = std::move(frozen_file_);
|
||||
|
||||
DCHECK(ro_file);
|
||||
freezeable_ = false;
|
||||
-
|
||||
ro_out->Close();
|
||||
ro_out->mapped_file_ = std::move(ro_file);
|
||||
ro_out->max_size_ = max_size_;
|
||||
@@ -238,6 +482,8 @@ bool SharedMemory::ReadOnlyCopy(SharedMemory* ro_out) {
|
||||
return true;
|
||||
}
|
||||
|
||||
+#endif // not Android
|
||||
+
|
||||
bool SharedMemory::Map(size_t bytes, void* fixed_address) {
|
||||
if (!mapped_file_) {
|
||||
return false;
|
||||
@@ -292,10 +538,12 @@ void SharedMemory::Close(bool unmap_view) {
|
||||
}
|
||||
|
||||
mapped_file_ = nullptr;
|
||||
+#ifndef ANDROID
|
||||
if (frozen_file_) {
|
||||
CHROMIUM_LOG(WARNING) << "freezeable shared memory was never frozen";
|
||||
frozen_file_ = nullptr;
|
||||
}
|
||||
+#endif
|
||||
}
|
||||
|
||||
} // namespace base
|
||||
diff --git ipc/gtest/TestSharedMemory.cpp ipc/gtest/TestSharedMemory.cpp
|
||||
index 4c8ab0c77592..1474be0ea0d9 100644
|
||||
--- ipc/gtest/TestSharedMemory.cpp
|
||||
+++ ipc/gtest/TestSharedMemory.cpp
|
||||
@@ -13,6 +13,15 @@
|
||||
#include "mozilla/ipc/SharedMemory.h"
|
||||
#include "mozilla/ipc/SharedMemoryBasic.h"
|
||||
|
||||
+#ifdef XP_LINUX
|
||||
+# include <errno.h>
|
||||
+# include <linux/magic.h>
|
||||
+# include <stdio.h>
|
||||
+# include <string.h>
|
||||
+# include <sys/statfs.h>
|
||||
+# include <sys/utsname.h>
|
||||
+#endif
|
||||
+
|
||||
#ifdef XP_WIN
|
||||
# include <windows.h>
|
||||
#endif
|
||||
@@ -293,4 +302,41 @@ TEST(IPCSharedMemory, BasicIsZero)
|
||||
}
|
||||
#endif
|
||||
|
||||
+#if defined(XP_LINUX) && !defined(ANDROID)
|
||||
+// Test that memfd_create is used where expected.
|
||||
+//
|
||||
+// More precisely: if memfd_create support is expected, verify that
|
||||
+// shared memory isn't subject to a filesystem size limit.
|
||||
+TEST(IPCSharedMemory, IsMemfd)
|
||||
+{
|
||||
+ static constexpr int kMajor = 3;
|
||||
+ static constexpr int kMinor = 17;
|
||||
+
|
||||
+ struct utsname uts;
|
||||
+ ASSERT_EQ(uname(&uts), 0) << strerror(errno);
|
||||
+ ASSERT_STREQ(uts.sysname, "Linux");
|
||||
+ int major, minor;
|
||||
+ ASSERT_EQ(sscanf(uts.release, "%d.%d", &major, &minor), 2);
|
||||
+ bool expectMemfd = major > kMajor || (major == kMajor && minor >= kMinor);
|
||||
+
|
||||
+ base::SharedMemory shm;
|
||||
+ ASSERT_TRUE(shm.Create(1));
|
||||
+ UniqueFileHandle fd = shm.TakeHandle();
|
||||
+ ASSERT_TRUE(fd);
|
||||
+
|
||||
+ struct statfs fs;
|
||||
+ ASSERT_EQ(fstatfs(fd.get(), &fs), 0) << strerror(errno);
|
||||
+ EXPECT_EQ(fs.f_type, TMPFS_MAGIC);
|
||||
+ static constexpr decltype(fs.f_blocks) kNoLimit = 0;
|
||||
+ if (expectMemfd) {
|
||||
+ EXPECT_EQ(fs.f_blocks, kNoLimit);
|
||||
+ } else {
|
||||
+ // On older kernels, we expect the memfd / no-limit test to fail.
|
||||
+ // (In theory it could succeed if backported memfd support exists;
|
||||
+ // if that ever happens, this check can be removed.)
|
||||
+ EXPECT_NE(fs.f_blocks, kNoLimit);
|
||||
+ }
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
} // namespace mozilla
|
||||
diff --git security/sandbox/linux/SandboxFilter.cpp security/sandbox/linux/SandboxFilter.cpp
|
||||
index b337a513791e..3017cd967766 100644
|
||||
--- security/sandbox/linux/SandboxFilter.cpp
|
||||
+++ security/sandbox/linux/SandboxFilter.cpp
|
||||
@@ -704,6 +704,10 @@ class SandboxPolicyCommon : public SandboxPolicyBase {
|
||||
case __NR_munmap:
|
||||
return Allow();
|
||||
|
||||
+ // Shared memory
|
||||
+ case __NR_memfd_create:
|
||||
+ return Allow();
|
||||
+
|
||||
// ipc::Shmem; also, glibc when creating threads:
|
||||
case __NR_mprotect:
|
||||
return Allow();
|
||||
@@ -1395,11 +1399,6 @@ class ContentSandboxPolicy : public SandboxPolicyCommon {
|
||||
case __NR_eventfd2:
|
||||
return Allow();
|
||||
|
||||
-# ifdef __NR_memfd_create
|
||||
- case __NR_memfd_create:
|
||||
- return Allow();
|
||||
-# endif
|
||||
-
|
||||
# ifdef __NR_rt_tgsigqueueinfo
|
||||
// Only allow to send signals within the process.
|
||||
case __NR_rt_tgsigqueueinfo: {
|
@ -21,7 +21,7 @@ diff -r 46ea866ca3ac -r 6ef20eee3f8f gfx/2d/DrawTargetSkia.cpp
|
||||
SkCanvas::kPreserveLCDText_SaveLayerFlag |
|
||||
(aCopyBackground ? SkCanvas::kInitWithPrevious_SaveLayerFlag : 0));
|
||||
|
||||
+#if MOZ_BIG_ENDIAN
|
||||
+#if MOZ_BIG_ENDIAN()
|
||||
+ // Pushing a layer where an aMask is defined produces wrong output.
|
||||
+ // We _should_ endian swap the data, but I couldn't find a workable way to do so
|
||||
+ // Therefore I deactivate those layers in the meantime.
|
||||
|
@ -14,24 +14,24 @@ diff --git config/external/moz.build config/external/moz.build
|
||||
index 03e4fa143bd1..a67d10b11fe6 100644
|
||||
--- config/external/moz.build
|
||||
+++ config/external/moz.build
|
||||
@@ -37,8 +37,9 @@ if not CONFIG['MOZ_SYSTEM_LIBVPX']:
|
||||
external_dirs += ['media/libvpx']
|
||||
@@ -40,8 +40,9 @@ if not CONFIG["MOZ_SYSTEM_LIBVPX"]:
|
||||
external_dirs += ["media/libvpx"]
|
||||
|
||||
if CONFIG['MOZ_AV1']:
|
||||
- external_dirs += ['media/libaom']
|
||||
- external_dirs += ['media/libdav1d']
|
||||
+ if not CONFIG['MOZ_SYSTEM_AV1']:
|
||||
+ external_dirs += ['media/libaom']
|
||||
+ external_dirs += ['media/libdav1d']
|
||||
if CONFIG["MOZ_AV1"]:
|
||||
- external_dirs += ["media/libaom"]
|
||||
- external_dirs += ["media/libdav1d"]
|
||||
+ if not CONFIG["MOZ_SYSTEM_AV1"]:
|
||||
+ external_dirs += ["media/libaom"]
|
||||
+ external_dirs += ["media/libdav1d"]
|
||||
|
||||
if not CONFIG['MOZ_SYSTEM_PNG']:
|
||||
external_dirs += ['media/libpng']
|
||||
if not CONFIG["MOZ_SYSTEM_PNG"]:
|
||||
external_dirs += ["media/libpng"]
|
||||
diff --git config/system-headers.mozbuild config/system-headers.mozbuild
|
||||
index bcf5c4925564..48964a999a9b 100644
|
||||
--- config/system-headers.mozbuild
|
||||
+++ config/system-headers.mozbuild
|
||||
@@ -1304,6 +1304,14 @@ if CONFIG['MOZ_ENABLE_CONTENTMANAGER']:
|
||||
'SelectSingleContentItemPage.h',
|
||||
@@ -1305,6 +1305,14 @@ if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
|
||||
'harfbuzz/hb.h',
|
||||
]
|
||||
|
||||
+if CONFIG['MOZ_SYSTEM_AV1']:
|
||||
@ -49,9 +49,9 @@ diff --git dom/media/platforms/moz.build dom/media/platforms/moz.build
|
||||
index 092cee0c9b66..38e45de5b5f0 100644
|
||||
--- dom/media/platforms/moz.build
|
||||
+++ dom/media/platforms/moz.build
|
||||
@@ -80,6 +80,11 @@ if CONFIG['MOZ_AV1']:
|
||||
'agnostic/AOMDecoder.cpp',
|
||||
'agnostic/DAV1DDecoder.cpp',
|
||||
@@ -78,6 +78,11 @@ if CONFIG["MOZ_AV1"]:
|
||||
"agnostic/AOMDecoder.cpp",
|
||||
"agnostic/DAV1DDecoder.cpp",
|
||||
]
|
||||
+ if CONFIG['MOZ_SYSTEM_AV1']:
|
||||
+ CXXFLAGS += CONFIG['MOZ_SYSTEM_LIBAOM_CFLAGS']
|
||||
@ -59,25 +59,25 @@ index 092cee0c9b66..38e45de5b5f0 100644
|
||||
+ CXXFLAGS += CONFIG['MOZ_SYSTEM_LIBDAV1D_CFLAGS']
|
||||
+ OS_LIBS += CONFIG['MOZ_SYSTEM_LIBDAV1D_LIBS']
|
||||
|
||||
if CONFIG['MOZ_OMX']:
|
||||
if CONFIG["MOZ_OMX"]:
|
||||
EXPORTS += [
|
||||
diff --git toolkit/moz.configure toolkit/moz.configure
|
||||
index 82b5a59acf42..e2329560b42b 100644
|
||||
--- toolkit/moz.configure
|
||||
+++ toolkit/moz.configure
|
||||
@@ -441,7 +441,23 @@ def av1(value):
|
||||
if value:
|
||||
@@ -553,7 +553,23 @@ def av1(value):
|
||||
return True
|
||||
|
||||
|
||||
-@depends(target, nasm_version, when=av1 & compile_environment)
|
||||
+option('--with-system-av1',
|
||||
+option("--with-system-av1",
|
||||
+ help="Use system av1 (located with pkgconfig)")
|
||||
+
|
||||
+system_libaom_info = pkg_check_modules('MOZ_SYSTEM_LIBAOM', 'aom >= 1.0.0',
|
||||
+ when='--with-system-av1')
|
||||
+system_libaom_info = pkg_check_modules("MOZ_SYSTEM_LIBAOM", "aom >= 1.0.0",
|
||||
+ when="--with-system-av1")
|
||||
+
|
||||
+system_libdav1d_info = pkg_check_modules('MOZ_SYSTEM_LIBDAV1D', 'dav1d >= 0.1.1',
|
||||
+ when='--with-system-av1')
|
||||
+system_libdav1d_info = pkg_check_modules("MOZ_SYSTEM_LIBDAV1D", "dav1d >= 0.1.1",
|
||||
+ when="--with-system-av1")
|
||||
+
|
||||
+@depends(system_libaom_info, system_libdav1d_info)
|
||||
+def system_av1(system_libaom_info, system_libdav1d_info):
|
||||
@ -88,13 +88,13 @@ index 82b5a59acf42..e2329560b42b 100644
|
||||
+
|
||||
+@depends(target, nasm_version, when=av1 & depends(system_av1)(lambda v: not v) & compile_environment)
|
||||
def dav1d_asm(target, nasm_version):
|
||||
if target.os != 'Android':
|
||||
if target.cpu == 'aarch64':
|
||||
@@ -457,6 +473,7 @@ set_config('MOZ_DAV1D_ASM', dav1d_asm)
|
||||
set_define('MOZ_DAV1D_ASM', dav1d_asm)
|
||||
set_config('MOZ_AV1', av1)
|
||||
set_define('MOZ_AV1', av1)
|
||||
+set_config('MOZ_SYSTEM_AV1', depends_if(system_av1)(lambda _: True))
|
||||
if target.cpu == "aarch64":
|
||||
return True
|
||||
@@ -570,6 +586,7 @@ set_config("MOZ_DAV1D_ASM", dav1d_asm)
|
||||
set_define("MOZ_DAV1D_ASM", dav1d_asm)
|
||||
set_config("MOZ_AV1", av1)
|
||||
set_define("MOZ_AV1", av1)
|
||||
+set_config("MOZ_SYSTEM_AV1", depends_if(system_av1)(lambda _: True))
|
||||
|
||||
# Built-in fragmented MP4 support.
|
||||
# ==============================================================
|
||||
|
@ -4,8 +4,7 @@ diff --git widget/gtk/WindowSurfaceWayland.cpp widget/gtk/WindowSurfaceWayland.c
|
||||
index 9a73326399bd5..9e42a7f1c5d18 100644
|
||||
--- widget/gtk/WindowSurfaceWayland.cpp
|
||||
+++ widget/gtk/WindowSurfaceWayland.cpp
|
||||
@@ -222,20 +222,21 @@ static int WaylandAllocateShmMemory(int aSize) {
|
||||
#ifdef HAVE_POSIX_FALLOCATE
|
||||
@@ -221,7 +221,9 @@ static int WaylandAllocateShmMemory(int aSize) {
|
||||
do {
|
||||
ret = posix_fallocate(fd, 0, aSize);
|
||||
} while (ret == EINTR);
|
||||
@ -13,29 +12,32 @@ index 9a73326399bd5..9e42a7f1c5d18 100644
|
||||
+ if (ret == 0) {
|
||||
+ return fd;
|
||||
+ } else if (ret != ENODEV && ret != EINVAL && ret != EOPNOTSUPP) {
|
||||
NS_WARNING(
|
||||
nsPrintfCString("posix_fallocate() fails to allocate shm memory: %s",
|
||||
strerror(ret))
|
||||
@@ -229,7 +231,7 @@ static int WaylandAllocateShmMemory(int aSize) {
|
||||
close(fd);
|
||||
MOZ_CRASH("posix_fallocate() fails to allocate shm memory");
|
||||
return -1;
|
||||
}
|
||||
-#else
|
||||
+#endif
|
||||
do {
|
||||
ret = ftruncate(fd, aSize);
|
||||
} while (ret < 0 && errno == EINTR);
|
||||
if (ret < 0) {
|
||||
@@ -240,7 +242,6 @@ static int WaylandAllocateShmMemory(int aSize) {
|
||||
close(fd);
|
||||
MOZ_CRASH("ftruncate() fails to allocate shm memory");
|
||||
fd = -1;
|
||||
}
|
||||
-#endif
|
||||
|
||||
return fd;
|
||||
}
|
||||
@@ -265,8 +266,8 @@ bool WaylandShmPool::Resize(int aSize) {
|
||||
#ifdef HAVE_POSIX_FALLOCATE
|
||||
@@ -253,7 +254,7 @@ static bool WaylandReAllocateShmMemory(int aFd, int aSize) {
|
||||
do {
|
||||
errno = posix_fallocate(mShmPoolFd, 0, aSize);
|
||||
errno = posix_fallocate(aFd, 0, aSize);
|
||||
} while (errno == EINTR);
|
||||
- if (errno != 0) return false;
|
||||
+ if (errno != 0 && errno != ENODEV && errno != EINVAL && errno != EOPNOTSUPP) return false;
|
||||
- if (errno != 0) {
|
||||
+ if (errno != 0 && errno != ENODEV && errno != EINVAL && errno != EOPNOTSUPP) {
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
wl_shm_pool_resize(mShmPool, aSize);
|
||||
|
@ -62,7 +62,7 @@ diff --git dom/media/AudioStream.h dom/media/AudioStream.h
|
||||
index 933e4cb3bfdb5..5d2181e632af9 100644
|
||||
--- dom/media/AudioStream.h
|
||||
+++ dom/media/AudioStream.h
|
||||
@@ -304,7 +304,6 @@
|
||||
@@ -307,7 +307,6 @@ class AudioStream final
|
||||
|
||||
template <typename Function, typename... Args>
|
||||
int InvokeCubeb(Function aFunction, Args&&... aArgs);
|
||||
@ -70,13 +70,13 @@ index 933e4cb3bfdb5..5d2181e632af9 100644
|
||||
|
||||
// The monitor is held to protect all access to member variables.
|
||||
Monitor mMonitor;
|
||||
@@ -338,9 +337,6 @@
|
||||
@@ -341,9 +340,6 @@ class AudioStream final
|
||||
// the default device is used. It is set
|
||||
// during the Init() in decoder thread.
|
||||
RefPtr<AudioDeviceInfo> mSinkInfo;
|
||||
- /* Contains the id of the audio thread, from profiler_get_thread_id. */
|
||||
- std::atomic<int> mAudioThreadId;
|
||||
- const bool mSandboxed = false;
|
||||
};
|
||||
|
||||
} // namespace mozilla
|
||||
MozPromiseHolder<MediaSink::EndedPromise> mEndedPromise;
|
||||
Atomic<bool> mPlaybackComplete;
|
||||
|
@ -1,15 +0,0 @@
|
||||
Look for gm4 in addition to m4
|
||||
|
||||
diff --git build/moz.configure/old.configure build/moz.configure/old.configure
|
||||
index 8c807c0794fab..5132228960f3d 100644
|
||||
--- build/moz.configure/old.configure
|
||||
+++ build/moz.configure/old.configure
|
||||
@@ -5,7 +5,7 @@
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
|
||||
-m4 = check_prog('M4', ('m4',))
|
||||
+m4 = check_prog('M4', ('gm4', 'm4',))
|
||||
|
||||
|
||||
@depends(mozconfig)
|
122
www/firefox/files/patch-bug1676134
Normal file
122
www/firefox/files/patch-bug1676134
Normal file
@ -0,0 +1,122 @@
|
||||
Enable Pipewire on BSDs
|
||||
|
||||
diff --git third_party/libwebrtc/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build third_party/libwebrtc/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
|
||||
index a0e116195e0e..cbe27e94108b 100644
|
||||
--- third_party/libwebrtc/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
|
||||
+++ third_party/libwebrtc/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
|
||||
@@ -87,8 +87,13 @@ if CONFIG["OS_TARGET"] == "DragonFly":
|
||||
DEFINES["USE_X11"] = "1"
|
||||
DEFINES["WEBRTC_BSD"] = True
|
||||
DEFINES["WEBRTC_POSIX"] = True
|
||||
+ DEFINES["WEBRTC_USE_PIPEWIRE"] = True
|
||||
DEFINES["_FILE_OFFSET_BITS"] = "64"
|
||||
|
||||
+ LOCAL_INCLUDES += [
|
||||
+ "/third_party/pipewire/"
|
||||
+ ]
|
||||
+
|
||||
OS_LIBS += [
|
||||
"X11",
|
||||
"X11-xcb",
|
||||
@@ -103,11 +108,14 @@ if CONFIG["OS_TARGET"] == "DragonFly":
|
||||
]
|
||||
|
||||
UNIFIED_SOURCES += [
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/desktop_device_info_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/mouse_cursor_monitor_x11.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/screen_capturer_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/shared_x_display.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/shared_x_util.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_capturer_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_finder_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_list_utils.cc",
|
||||
@@ -124,8 +132,13 @@ if CONFIG["OS_TARGET"] == "FreeBSD":
|
||||
DEFINES["USE_X11"] = "1"
|
||||
DEFINES["WEBRTC_BSD"] = True
|
||||
DEFINES["WEBRTC_POSIX"] = True
|
||||
+ DEFINES["WEBRTC_USE_PIPEWIRE"] = True
|
||||
DEFINES["_FILE_OFFSET_BITS"] = "64"
|
||||
|
||||
+ LOCAL_INCLUDES += [
|
||||
+ "/third_party/pipewire/"
|
||||
+ ]
|
||||
+
|
||||
OS_LIBS += [
|
||||
"X11",
|
||||
"X11-xcb",
|
||||
@@ -140,11 +153,14 @@ if CONFIG["OS_TARGET"] == "FreeBSD":
|
||||
]
|
||||
|
||||
UNIFIED_SOURCES += [
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/desktop_device_info_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/mouse_cursor_monitor_x11.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/screen_capturer_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/shared_x_display.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/shared_x_util.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_capturer_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_finder_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_list_utils.cc",
|
||||
@@ -200,8 +216,13 @@ if CONFIG["OS_TARGET"] == "NetBSD":
|
||||
DEFINES["USE_X11"] = "1"
|
||||
DEFINES["WEBRTC_BSD"] = True
|
||||
DEFINES["WEBRTC_POSIX"] = True
|
||||
+ DEFINES["WEBRTC_USE_PIPEWIRE"] = True
|
||||
DEFINES["_FILE_OFFSET_BITS"] = "64"
|
||||
|
||||
+ LOCAL_INCLUDES += [
|
||||
+ "/third_party/pipewire/"
|
||||
+ ]
|
||||
+
|
||||
OS_LIBS += [
|
||||
"X11",
|
||||
"X11-xcb",
|
||||
@@ -216,11 +237,14 @@ if CONFIG["OS_TARGET"] == "NetBSD":
|
||||
]
|
||||
|
||||
UNIFIED_SOURCES += [
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/desktop_device_info_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/mouse_cursor_monitor_x11.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/screen_capturer_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/shared_x_display.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/shared_x_util.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_capturer_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_finder_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_list_utils.cc",
|
||||
@@ -237,8 +261,13 @@ if CONFIG["OS_TARGET"] == "OpenBSD":
|
||||
DEFINES["USE_X11"] = "1"
|
||||
DEFINES["WEBRTC_BSD"] = True
|
||||
DEFINES["WEBRTC_POSIX"] = True
|
||||
+ DEFINES["WEBRTC_USE_PIPEWIRE"] = True
|
||||
DEFINES["_FILE_OFFSET_BITS"] = "64"
|
||||
|
||||
+ LOCAL_INCLUDES += [
|
||||
+ "/third_party/pipewire/"
|
||||
+ ]
|
||||
+
|
||||
OS_LIBS += [
|
||||
"X11",
|
||||
"X11-xcb",
|
||||
@@ -253,11 +282,14 @@ if CONFIG["OS_TARGET"] == "OpenBSD":
|
||||
]
|
||||
|
||||
UNIFIED_SOURCES += [
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/desktop_device_info_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/mouse_cursor_monitor_x11.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/screen_capturer_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/shared_x_display.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/shared_x_util.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_capturer_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_finder_x11.cc",
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_list_utils.cc",
|
148
www/firefox/files/patch-bug1677715
Normal file
148
www/firefox/files/patch-bug1677715
Normal file
@ -0,0 +1,148 @@
|
||||
commit 16e7bdc29390
|
||||
Author: Dan Minor <dminor@mozilla.com>
|
||||
Date: Thu Nov 19 14:14:40 2020 +0000
|
||||
|
||||
Bug 1677715 - Build libpipewire as a dependency of libwebrtc; r=ng
|
||||
|
||||
Differential Revision: https://phabricator.services.mozilla.com/D97431
|
||||
---
|
||||
dom/media/webrtc/third_party_build/moz.build | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git dom/media/webrtc/third_party_build/moz.build dom/media/webrtc/third_party_build/moz.build
|
||||
index db10dab7ff21..dc0df3ba1b6c 100644
|
||||
--- dom/media/webrtc/third_party_build/moz.build
|
||||
+++ dom/media/webrtc/third_party_build/moz.build
|
||||
@@ -56,6 +56,9 @@ webrtc_non_unified_sources = [
|
||||
"../../../../third_party/libwebrtc/webrtc/video/overuse_frame_detector.cc", # Because of name clash with call_stats.cc on kWeightFactor
|
||||
]
|
||||
|
||||
+if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
|
||||
+ DIRS += ["../../../../third_party/pipewire/libpipewire"]
|
||||
+
|
||||
GN_DIRS += ["../../../../third_party/libwebrtc/webrtc"]
|
||||
|
||||
gn_vars_copy = gn_vars.copy()
|
||||
commit 553093ff0fa7
|
||||
Author: Dan Minor <dminor@mozilla.com>
|
||||
Date: Thu Nov 19 14:14:50 2020 +0000
|
||||
|
||||
Bug 1677715 - Regenerate moz.build files; r=ng
|
||||
|
||||
Differential Revision: https://phabricator.services.mozilla.com/D97433
|
||||
---
|
||||
.../desktop_capture_generic_gn/moz.build | 51 +++++++++++++++++-----
|
||||
third_party/libwebrtc/webrtc/moz.build | 3 --
|
||||
2 files changed, 40 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git third_party/libwebrtc/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build third_party/libwebrtc/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
|
||||
index 8df8b8b993f9..a0e116195e0e 100644
|
||||
--- third_party/libwebrtc/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
|
||||
+++ third_party/libwebrtc/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
### This moz.build was AUTOMATICALLY GENERATED from a GN config, ###
|
||||
### DO NOT edit it by hand. ###
|
||||
+if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
|
||||
+ CXXFLAGS += CONFIG["TK_CFLAGS"]
|
||||
|
||||
COMPILE_FLAGS["OS_INCLUDES"] = []
|
||||
AllowCompilerWarnings()
|
||||
@@ -25,8 +27,7 @@ LOCAL_INCLUDES += [
|
||||
"/ipc/chromium/src",
|
||||
"/ipc/glue",
|
||||
"/media/libyuv/libyuv/include/",
|
||||
- "/third_party/libwebrtc/webrtc/",
|
||||
- "/third_party/pipewire"
|
||||
+ "/third_party/libwebrtc/webrtc/"
|
||||
]
|
||||
|
||||
UNIFIED_SOURCES += [
|
||||
@@ -162,7 +163,6 @@ if CONFIG["OS_TARGET"] == "Linux":
|
||||
DEFINES["WEBRTC_LINUX"] = True
|
||||
DEFINES["WEBRTC_POSIX"] = True
|
||||
DEFINES["_FILE_OFFSET_BITS"] = "64"
|
||||
- DEFINES["WEBRTC_USE_PIPEWIRE"] = "1"
|
||||
|
||||
OS_LIBS += [
|
||||
"rt",
|
||||
@@ -195,14 +195,6 @@ if CONFIG["OS_TARGET"] == "Linux":
|
||||
"/third_party/libwebrtc/webrtc/modules/desktop_capture/window_capturer_linux.cc"
|
||||
]
|
||||
|
||||
- CXXFLAGS += CONFIG['TK_CFLAGS']
|
||||
-
|
||||
- UNIFIED_SOURCES += [
|
||||
- "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc",
|
||||
- "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc",
|
||||
- "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc"
|
||||
- ]
|
||||
-
|
||||
if CONFIG["OS_TARGET"] == "NetBSD":
|
||||
|
||||
DEFINES["USE_X11"] = "1"
|
||||
@@ -393,6 +385,17 @@ if CONFIG["CPU_ARCH"] == "aarch64" and CONFIG["OS_TARGET"] == "Linux":
|
||||
|
||||
DEFINES["DISABLE_NACL"] = True
|
||||
DEFINES["NO_TCMALLOC"] = True
|
||||
+ DEFINES["WEBRTC_USE_PIPEWIRE"] = True
|
||||
+
|
||||
+ LOCAL_INCLUDES += [
|
||||
+ "/third_party/pipewire/"
|
||||
+ ]
|
||||
+
|
||||
+ UNIFIED_SOURCES += [
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc"
|
||||
+ ]
|
||||
|
||||
if CONFIG["CPU_ARCH"] == "x86" and CONFIG["OS_TARGET"] == "Linux":
|
||||
|
||||
@@ -400,6 +403,32 @@ if CONFIG["CPU_ARCH"] == "x86" and CONFIG["OS_TARGET"] == "Linux":
|
||||
"-msse2"
|
||||
]
|
||||
|
||||
+ DEFINES["WEBRTC_USE_PIPEWIRE"] = True
|
||||
+
|
||||
+ LOCAL_INCLUDES += [
|
||||
+ "/third_party/pipewire/"
|
||||
+ ]
|
||||
+
|
||||
+ UNIFIED_SOURCES += [
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc"
|
||||
+ ]
|
||||
+
|
||||
+if CONFIG["CPU_ARCH"] == "x86_64" and CONFIG["OS_TARGET"] == "Linux":
|
||||
+
|
||||
+ DEFINES["WEBRTC_USE_PIPEWIRE"] = True
|
||||
+
|
||||
+ LOCAL_INCLUDES += [
|
||||
+ "/third_party/pipewire/"
|
||||
+ ]
|
||||
+
|
||||
+ UNIFIED_SOURCES += [
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc",
|
||||
+ "/third_party/libwebrtc/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc"
|
||||
+ ]
|
||||
+
|
||||
if CONFIG["CPU_ARCH"] == "x86" and CONFIG["OS_TARGET"] == "NetBSD":
|
||||
|
||||
CXXFLAGS += [
|
||||
diff --git third_party/libwebrtc/webrtc/moz.build third_party/libwebrtc/webrtc/moz.build
|
||||
index 53af3e5786bf..295247899372 100644
|
||||
--- third_party/libwebrtc/webrtc/moz.build
|
||||
+++ third_party/libwebrtc/webrtc/moz.build
|
||||
@@ -186,9 +186,6 @@ if CONFIG["OS_TARGET"] == "Linux":
|
||||
"/third_party/libwebrtc/webrtc/modules/video_capture/video_capture_internal_impl_gn",
|
||||
"/third_party/libwebrtc/webrtc/system_wrappers/cpu_features_linux_gn"
|
||||
]
|
||||
- DIRS += [
|
||||
- "/third_party/pipewire/libpipewire"
|
||||
- ]
|
||||
|
||||
if CONFIG["OS_TARGET"] == "NetBSD":
|
||||
|
@ -4,7 +4,7 @@ diff --git config/system-headers.mozbuild config/system-headers.mozbuild
|
||||
index 7620b4d00623..09d3db5ca8c0 100644
|
||||
--- config/system-headers.mozbuild
|
||||
+++ config/system-headers.mozbuild
|
||||
@@ -1299,6 +1299,19 @@ if CONFIG['MOZ_ENABLE_LIBPROXY']:
|
||||
@@ -1292,6 +1292,19 @@ if CONFIG['MOZ_ENABLE_LIBPROXY']:
|
||||
'proxy.h',
|
||||
]
|
||||
|
||||
@ -28,16 +28,16 @@ diff --git dom/base/moz.build dom/base/moz.build
|
||||
index 8e19020315ae..2fcdbb6f7b42 100644
|
||||
--- dom/base/moz.build
|
||||
+++ dom/base/moz.build
|
||||
@@ -543,6 +543,9 @@ if CONFIG['MOZ_BUILD_APP'] in ['browser', 'mobile/android', 'xulrunner']:
|
||||
if CONFIG['MOZ_X11']:
|
||||
CXXFLAGS += CONFIG['TK_CFLAGS']
|
||||
@@ -546,6 +546,9 @@ if CONFIG["MOZ_BUILD_APP"] in ["browser", "mobile/android", "xulrunner"]:
|
||||
if CONFIG["MOZ_X11"]:
|
||||
CXXFLAGS += CONFIG["TK_CFLAGS"]
|
||||
|
||||
+if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
|
||||
+ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
|
||||
+if CONFIG["MOZ_SYSTEM_HARFBUZZ"]:
|
||||
+ CXXFLAGS += CONFIG["MOZ_HARFBUZZ_CFLAGS"]
|
||||
+
|
||||
GeneratedFile('UseCounterList.h', script='gen-usecounters.py',
|
||||
entry_point='use_counter_list', inputs=['UseCounters.conf'])
|
||||
|
||||
GeneratedFile(
|
||||
"UseCounterList.h",
|
||||
script="gen-usecounters.py",
|
||||
diff --git gfx/graphite2/geckoextra/moz.build gfx/graphite2/geckoextra/moz.build
|
||||
new file mode 100644
|
||||
index 0000000000000..24e8d7a03274a
|
||||
@ -112,35 +112,35 @@ diff --git gfx/moz.build gfx/moz.build
|
||||
index 771f652e837a..3b358d84e384 100644
|
||||
--- gfx/moz.build
|
||||
+++ gfx/moz.build
|
||||
@@ -13,6 +13,14 @@ with Files('wr/**'):
|
||||
if CONFIG['MOZ_TREE_CAIRO']:
|
||||
DIRS += ['cairo']
|
||||
@@ -13,6 +13,14 @@ with Files("wr/**"):
|
||||
if CONFIG["MOZ_TREE_CAIRO"]:
|
||||
DIRS += ["cairo"]
|
||||
|
||||
+if CONFIG['MOZ_SYSTEM_GRAPHITE2']:
|
||||
+ DIRS += ['graphite2/geckoextra']
|
||||
+if CONFIG["MOZ_SYSTEM_GRAPHITE2"]:
|
||||
+ DIRS += ["graphite2/geckoextra"]
|
||||
+else:
|
||||
+ DIRS += ['graphite2/src' ]
|
||||
+ DIRS += ["graphite2/src" ]
|
||||
+
|
||||
+if not CONFIG['MOZ_SYSTEM_HARFBUZZ']:
|
||||
+ DIRS += ['harfbuzz/src']
|
||||
+if not CONFIG["MOZ_SYSTEM_HARFBUZZ"]:
|
||||
+ DIRS += ["harfbuzz/src"]
|
||||
+
|
||||
DIRS += [
|
||||
'2d',
|
||||
'ycbcr',
|
||||
"2d",
|
||||
"ycbcr",
|
||||
@@ -21,8 +29,6 @@ DIRS += [
|
||||
'qcms',
|
||||
'gl',
|
||||
'layers',
|
||||
- 'graphite2/src',
|
||||
- 'harfbuzz/src',
|
||||
'ots/src',
|
||||
'thebes',
|
||||
'ipc',
|
||||
"qcms",
|
||||
"gl",
|
||||
"layers",
|
||||
- "graphite2/src",
|
||||
- "harfbuzz/src",
|
||||
"ots/src",
|
||||
"thebes",
|
||||
"ipc",
|
||||
diff --git gfx/skia/generate_mozbuild.py gfx/skia/generate_mozbuild.py
|
||||
index e06ae3457a47..93faa61594a3 100755
|
||||
--- gfx/skia/generate_mozbuild.py
|
||||
+++ gfx/skia/generate_mozbuild.py
|
||||
@@ -117,6 +117,9 @@ if CONFIG['CC_TYPE'] in ('clang', 'clang-cl'):
|
||||
@@ -98,6 +98,9 @@ if CONFIG['CC_TYPE'] in ('clang', 'clang-cl'):
|
||||
'-Wno-unused-private-field',
|
||||
]
|
||||
|
||||
@ -154,7 +154,7 @@ diff --git gfx/skia/moz.build gfx/skia/moz.build
|
||||
index 2118677ca3a8..e4978b413784 100644
|
||||
--- gfx/skia/moz.build
|
||||
+++ gfx/skia/moz.build
|
||||
@@ -493,6 +493,9 @@ if CONFIG['CC_TYPE'] in ('clang', 'clang-cl'):
|
||||
@@ -490,6 +490,9 @@ if CONFIG['CC_TYPE'] in ('clang', 'clang-cl'):
|
||||
'-Wno-unused-private-field',
|
||||
]
|
||||
|
||||
@ -168,49 +168,49 @@ diff --git gfx/thebes/moz.build gfx/thebes/moz.build
|
||||
index 56f1b9fe3f4b..0ac1100b0df3 100644
|
||||
--- gfx/thebes/moz.build
|
||||
+++ gfx/thebes/moz.build
|
||||
@@ -284,7 +284,13 @@ if CONFIG['MOZ_WAYLAND']:
|
||||
@@ -287,7 +287,13 @@ if CONFIG["MOZ_WAYLAND"]:
|
||||
|
||||
LOCAL_INCLUDES += CONFIG['SKIA_INCLUDES']
|
||||
LOCAL_INCLUDES += CONFIG["SKIA_INCLUDES"]
|
||||
|
||||
-DEFINES['GRAPHITE2_STATIC'] = True
|
||||
+if CONFIG['MOZ_SYSTEM_GRAPHITE2']:
|
||||
+ CXXFLAGS += CONFIG['MOZ_GRAPHITE2_CFLAGS']
|
||||
-DEFINES["GRAPHITE2_STATIC"] = True
|
||||
+if CONFIG["MOZ_SYSTEM_GRAPHITE2"]:
|
||||
+ CXXFLAGS += CONFIG["MOZ_GRAPHITE2_CFLAGS"]
|
||||
+else:
|
||||
+ DEFINES['GRAPHITE2_STATIC'] = True
|
||||
+ DEFINES["GRAPHITE2_STATIC"] = True
|
||||
+
|
||||
+if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
|
||||
+ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
|
||||
+if CONFIG["MOZ_SYSTEM_HARFBUZZ"]:
|
||||
+ CXXFLAGS += CONFIG["MOZ_HARFBUZZ_CFLAGS"]
|
||||
|
||||
if CONFIG['CC_TYPE'] == 'clang':
|
||||
if CONFIG["CC_TYPE"] == "clang":
|
||||
# Suppress warnings from Skia header files.
|
||||
diff --git intl/unicharutil/util/moz.build intl/unicharutil/util/moz.build
|
||||
index cb1233c56d7e..06fb1f9f174b 100644
|
||||
--- intl/unicharutil/util/moz.build
|
||||
+++ intl/unicharutil/util/moz.build
|
||||
@@ -25,4 +25,7 @@ UNIFIED_SOURCES += [
|
||||
'nsUnicodeProperties.cpp',
|
||||
"nsUnicodeProperties.cpp",
|
||||
]
|
||||
|
||||
+if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
|
||||
+ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
|
||||
+if CONFIG["MOZ_SYSTEM_HARFBUZZ"]:
|
||||
+ CXXFLAGS += CONFIG["MOZ_HARFBUZZ_CFLAGS"]
|
||||
+
|
||||
FINAL_LIBRARY = 'xul'
|
||||
FINAL_LIBRARY = "xul"
|
||||
diff --git netwerk/dns/moz.build netwerk/dns/moz.build
|
||||
index 79c26e3e7001..c4d93bc5f7dc 100644
|
||||
--- netwerk/dns/moz.build
|
||||
+++ netwerk/dns/moz.build
|
||||
@@ -86,3 +86,6 @@ USE_LIBS += ['icu']
|
||||
@@ -105,3 +105,6 @@ USE_LIBS += ["icu"]
|
||||
|
||||
if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
|
||||
CXXFLAGS += ['-Wno-error=shadow']
|
||||
if CONFIG["CC_TYPE"] in ("clang", "gcc"):
|
||||
CXXFLAGS += ["-Wno-error=shadow"]
|
||||
+
|
||||
+if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
|
||||
+ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
|
||||
+if CONFIG["MOZ_SYSTEM_HARFBUZZ"]:
|
||||
+ CXXFLAGS += CONFIG["MOZ_HARFBUZZ_CFLAGS"]
|
||||
diff --git old-configure.in old-configure.in
|
||||
index 95a58b634593..b614eef85c89 100644
|
||||
--- old-configure.in
|
||||
+++ old-configure.in
|
||||
@@ -2639,6 +2639,27 @@ dnl ========================================================
|
||||
@@ -2303,6 +2303,27 @@ dnl ========================================================
|
||||
|
||||
AC_SUBST(MOZ_LINUX_32_SSE2_STARTUP_ERROR)
|
||||
|
||||
@ -242,46 +242,46 @@ diff --git toolkit/library/moz.build toolkit/library/moz.build
|
||||
index 24f940e1ed7e..079a575adec3 100644
|
||||
--- toolkit/library/moz.build
|
||||
+++ toolkit/library/moz.build
|
||||
@@ -248,6 +248,12 @@ if CONFIG['MOZ_SYSTEM_PNG']:
|
||||
if CONFIG['MOZ_SYSTEM_WEBP']:
|
||||
OS_LIBS += CONFIG['MOZ_WEBP_LIBS']
|
||||
@@ -247,6 +247,12 @@ if CONFIG["MOZ_SYSTEM_PNG"]:
|
||||
if CONFIG["MOZ_SYSTEM_WEBP"]:
|
||||
OS_LIBS += CONFIG["MOZ_WEBP_LIBS"]
|
||||
|
||||
+if CONFIG['MOZ_SYSTEM_GRAPHITE2']:
|
||||
+ OS_LIBS += CONFIG['MOZ_GRAPHITE2_LIBS']
|
||||
+if CONFIG["MOZ_SYSTEM_GRAPHITE2"]:
|
||||
+ OS_LIBS += CONFIG["MOZ_GRAPHITE2_LIBS"]
|
||||
+
|
||||
+if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
|
||||
+ OS_LIBS += CONFIG['MOZ_HARFBUZZ_LIBS']
|
||||
+if CONFIG["MOZ_SYSTEM_HARFBUZZ"]:
|
||||
+ OS_LIBS += CONFIG["MOZ_HARFBUZZ_LIBS"]
|
||||
+
|
||||
if CONFIG['MOZ_SYSTEM_LIBEVENT']:
|
||||
OS_LIBS += CONFIG['MOZ_LIBEVENT_LIBS']
|
||||
if CONFIG["MOZ_SYSTEM_LIBEVENT"]:
|
||||
OS_LIBS += CONFIG["MOZ_LIBEVENT_LIBS"]
|
||||
|
||||
diff --git toolkit/moz.configure toolkit/moz.configure
|
||||
index 9297e4d6f501..d8e273887e4b 100644
|
||||
--- toolkit/moz.configure
|
||||
+++ toolkit/moz.configure
|
||||
@@ -937,6 +937,25 @@ add_old_configure_assignment('FT2_LIBS',
|
||||
add_old_configure_assignment('FT2_CFLAGS',
|
||||
ft2_info.cflags)
|
||||
@@ -1055,6 +1055,25 @@ set_config("FT2_LIBS", ft2_info.libs)
|
||||
add_old_configure_assignment("FT2_LIBS", ft2_info.libs)
|
||||
add_old_configure_assignment("FT2_CFLAGS", ft2_info.cflags)
|
||||
|
||||
+# Graphite2
|
||||
+# ==============================================================
|
||||
+option('--with-system-graphite2',
|
||||
+option("--with-system-graphite2",
|
||||
+ help="Use system graphite2 (located with pkgconfig)")
|
||||
+
|
||||
+system_graphite2 = pkg_check_modules('MOZ_GRAPHITE2', 'graphite2',
|
||||
+ when='--with-system-graphite2')
|
||||
+system_graphite2 = pkg_check_modules("MOZ_GRAPHITE2", "graphite2",
|
||||
+ when="--with-system-graphite2")
|
||||
+
|
||||
+set_config('MOZ_SYSTEM_GRAPHITE2', depends_if(system_graphite2)(lambda _: True))
|
||||
+set_config("MOZ_SYSTEM_GRAPHITE2", depends_if(system_graphite2)(lambda _: True))
|
||||
+
|
||||
+# HarfBuzz
|
||||
+# ==============================================================
|
||||
+option('--with-system-harfbuzz',
|
||||
+option("--with-system-harfbuzz",
|
||||
+ help="Use system harfbuzz (located with pkgconfig)")
|
||||
+
|
||||
+system_harfbuzz = pkg_check_modules('MOZ_HARFBUZZ', 'harfbuzz >= 2.6.8',
|
||||
+ when='--with-system-harfbuzz')
|
||||
+system_harfbuzz = pkg_check_modules("MOZ_HARFBUZZ", "harfbuzz >= 2.6.8",
|
||||
+ when="--with-system-harfbuzz")
|
||||
+
|
||||
+set_config('MOZ_SYSTEM_HARFBUZZ', depends_if(system_harfbuzz)(lambda _: True))
|
||||
+set_config("MOZ_SYSTEM_HARFBUZZ", depends_if(system_harfbuzz)(lambda _: True))
|
||||
|
||||
# Remote agent (part of CDP based remote protocol)
|
||||
# ==============================================================
|
||||
# Remote agent
|
||||
# (partial implementation of Chromium Remote Debugging Protocol)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -2,20 +2,20 @@
|
||||
|
||||
--- build/moz.configure/keyfiles.configure
|
||||
+++ build/moz.configure/keyfiles.configure
|
||||
@@ -18,6 +18,7 @@ def keyfile(desc, help=None, callback=lambda x: x):
|
||||
@checking('for the %s key' % desc, lambda x: x and x is not no_key)
|
||||
@imports(_from='__builtin__', _import='open')
|
||||
@imports(_from='__builtin__', _import='IOError')
|
||||
+ @imports(_from='os', _import='environ')
|
||||
@@ -19,6 +19,7 @@ def keyfile(desc, default=None, help=None, callback=lambda x: x):
|
||||
@checking("for the %s key" % desc, lambda x: x and x is not no_key)
|
||||
@imports(_from="__builtin__", _import="open")
|
||||
@imports(_from="__builtin__", _import="IOError")
|
||||
+ @imports(_from="os", _import="environ")
|
||||
def keyfile(value):
|
||||
if value:
|
||||
try:
|
||||
@@ -28,7 +29,7 @@ def keyfile(desc, help=None, callback=lambda x: x):
|
||||
@@ -29,7 +30,7 @@ def keyfile(desc, default=None, help=None, callback=lambda x: x):
|
||||
raise FatalCheckError("'%s' is empty." % value[0])
|
||||
except IOError as e:
|
||||
raise FatalCheckError("'%s': %s." % (value[0], e.strerror))
|
||||
- return no_key
|
||||
+ return environ.get('MOZ_%s_KEY' % desc.upper().replace(' ', '_')) or no_key
|
||||
+ return environ.get("MOZ_%s_KEY" % desc.upper().replace(" ", "_")) or no_key
|
||||
|
||||
return keyfile
|
||||
|
||||
|
21
www/firefox/files/patch-freebsd11
Normal file
21
www/firefox/files/patch-freebsd11
Normal file
@ -0,0 +1,21 @@
|
||||
Drop after FreeBSD 11 EOL, see https://svnweb.freebsd.org/changeset/base/303524
|
||||
|
||||
media/libcubeb/src/cubeb_oss.c:362:10: error: implicit declaration of function 'getline' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
|
||||
while (getline(&line, &linecap, sndstatfp) > 0) {
|
||||
^
|
||||
media/libcubeb/src/cubeb_oss.c:850:13: warning: comparison of integers of different signs: 'long' and 'unsigned int' [-Wsign-compare]
|
||||
if (nfr > s->bufframes) {
|
||||
~~~ ^ ~~~~~~~~~~~~
|
||||
|
||||
--- media/libcubeb/src/cubeb_oss.c.orig 2020-12-07 23:35:05 UTC
|
||||
+++ media/libcubeb/src/cubeb_oss.c
|
||||
@@ -10,6 +10,9 @@
|
||||
* accompanying file LICENSE for details.
|
||||
*/
|
||||
|
||||
+#if defined(__FreeBSD__) && __FreeBSD__ < 12
|
||||
+#define _WITH_GETLINE
|
||||
+#endif
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
Loading…
Reference in New Issue
Block a user