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:
Jan Beich 2020-12-14 18:08:02 +00:00
parent aeb6452ba7
commit c7357eee0c
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/branches/2020Q4/; revision=558102
15 changed files with 440 additions and 2277 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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: {

View File

@ -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.

View File

@ -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.
# ==============================================================

View File

@ -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);

View File

@ -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;

View File

@ -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)

View 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",

View 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":

View File

@ -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

View File

@ -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

View 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>