diff --git a/toolkit/crashreporter/bionic_missing_funcs.cpp b/toolkit/crashreporter/bionic_missing_funcs.cpp new file mode 100644 index 000000000000..81e8bef303b7 --- /dev/null +++ b/toolkit/crashreporter/bionic_missing_funcs.cpp @@ -0,0 +1,62 @@ +/* -*- 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 http://mozilla.org/MPL/2.0/. */ + +#include // For EPERM +#include // For syscall() +#include + +#include "mozilla/Assertions.h" + +extern "C" { + +#if defined(__ANDROID_API__) && (__ANDROID_API__ < 24) + +// Bionic introduced support for getgrgid_r() and getgrnam_r() only in version +// 24 (that is Android Nougat / 7.0). Since GeckoView is built with version 21, +// those functions aren't defined, but nix needs them and minidump-writer +// relies on nix. These functions should never be called in practice hence we +// implement them only to satisfy nix linking requirements but we crash if we +// accidentally enter them. + +int getgrgid_r(gid_t gid, struct group* grp, char* buf, size_t buflen, + struct group** result) { + MOZ_CRASH("getgrgid_r() is not available"); + return EPERM; +} + +int getgrnam_r(const char* name, struct group* grp, char* buf, size_t buflen, + struct group** result) { + MOZ_CRASH("getgrnam_r() is not available"); + return EPERM; +} + +#endif // __ANDROID_API__ && (__ANDROID_API__ < 24) + +#if defined(__ANDROID_API__) && (__ANDROID_API__ < 23) + +// Bionic introduced support for process_vm_readv() and process_vm_writev() only +// in version 23 (that is Android Marshmallow / 6.0). Since GeckoView is built +// on version 21, those functions aren't defined, but nix needs them and +// minidump-writer actually calls them. + +ssize_t process_vm_readv(pid_t pid, const struct iovec* local_iov, + unsigned long int liovcnt, + const struct iovec* remote_iov, + unsigned long int riovcnt, unsigned long int flags) { + return syscall(__NR_process_vm_readv, pid, local_iov, liovcnt, remote_iov, + riovcnt, flags); +} + +ssize_t process_vm_writev(pid_t pid, const struct iovec* local_iov, + unsigned long int liovcnt, + const struct iovec* remote_iov, + unsigned long int riovcnt, unsigned long int flags) { + return syscall(__NR_process_vm_writev, pid, local_iov, liovcnt, remote_iov, + riovcnt, flags); +} + +#endif // defined(__ANDROID_API__) && (__ANDROID_API__ < 23) +} diff --git a/toolkit/crashreporter/moz.build b/toolkit/crashreporter/moz.build index 1730dcf0d9e6..7658ee80ef34 100644 --- a/toolkit/crashreporter/moz.build +++ b/toolkit/crashreporter/moz.build @@ -96,12 +96,12 @@ if CONFIG["MOZ_CRASHREPORTER"]: DEFINES["ANDROID_NDK_MAJOR_VERSION"] = CONFIG["ANDROID_NDK_MAJOR_VERSION"] DEFINES["ANDROID_NDK_MINOR_VERSION"] = CONFIG["ANDROID_NDK_MINOR_VERSION"] DEFINES["ANDROID_PACKAGE_NAME"] = '"%s"' % CONFIG["ANDROID_PACKAGE_NAME"] - # NDK5 workarounds - DEFINES["_STLP_CONST_CONSTRUCTOR_BUG"] = True - DEFINES["_STLP_NO_MEMBER_TEMPLATES"] = True LOCAL_INCLUDES += [ "/toolkit/crashreporter/google-breakpad/src/common/android/include", ] + UNIFIED_SOURCES += [ + "bionic_missing_funcs.cpp", + ] DEFINES["UNICODE"] = True DEFINES["_UNICODE"] = True diff --git a/toolkit/crashreporter/nsExceptionHandler.cpp b/toolkit/crashreporter/nsExceptionHandler.cpp index 047c915f5b0d..03398a9b01f5 100644 --- a/toolkit/crashreporter/nsExceptionHandler.cpp +++ b/toolkit/crashreporter/nsExceptionHandler.cpp @@ -3882,39 +3882,3 @@ void SetNotificationPipeForChild(int childCrashFd) { #endif } // namespace CrashReporter - -#if defined(__ANDROID_API__) && (__ANDROID_API__ < 24) - -// Bionic introduced support for getgrgid_r() and getgrnam_r() only in version -// 24 (that is Android Nougat / 7.1.2). Since GeckoView is built by version 16 -// (32-bit) or 21 (64-bit), those functions aren't defined, but nix needs them -// and minidump-writer relies on nix. These functions should never be called -// in practice hence we implement them only to satisfy nix linking -// requirements but we crash if we accidentally enter them. - -extern "C" { - -int getgrgid_r(gid_t gid, struct group* grp, char* buf, size_t buflen, - struct group** result) { - MOZ_CRASH("getgrgid_r() is not available"); - return EPERM; -} - -int getgrnam_r(const char* name, struct group* grp, char* buf, size_t buflen, - struct group** result) { - MOZ_CRASH("getgrnam_r() is not available"); - return EPERM; -} - -int mlockall(int flags) { - MOZ_CRASH("mlockall() is not available"); - return EPERM; -} - -int munlockall(void) { - MOZ_CRASH("munlockall() is not available"); - return EPERM; -} -} - -#endif // __ANDROID_API__ && (__ANDROID_API__ < 24)