gecko-dev/toolkit/crashreporter/bionic_missing_funcs.cpp
Gabriele Svelto adc8165284 Bug 1896845 - Update the replacement functions for the missing ones in bionic r=KrisWright
This also removes some workarounds for prehistoric Android NDKs

Differential Revision: https://phabricator.services.mozilla.com/D210462
2024-05-22 08:05:10 +00:00

63 lines
2.4 KiB
C++

/* -*- 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 <errno.h> // For EPERM
#include <sys/syscall.h> // For syscall()
#include <unistd.h>
#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)
}