mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Merge pull request #84532 from al45tair/eng/PR-161391330-6.2.1
[Linux][Backtracing] Don't try to use `process_vm_readv()`.
This commit is contained in:
@@ -655,7 +655,6 @@ wait_paused(uint32_t expected, const struct timespec *timeout)
|
|||||||
char memserver_stack[4096] __attribute__((aligned(SWIFT_PAGE_SIZE)));
|
char memserver_stack[4096] __attribute__((aligned(SWIFT_PAGE_SIZE)));
|
||||||
char memserver_buffer[4096];
|
char memserver_buffer[4096];
|
||||||
int memserver_fd;
|
int memserver_fd;
|
||||||
bool memserver_has_ptrace;
|
|
||||||
sigjmp_buf memserver_fault_buf;
|
sigjmp_buf memserver_fault_buf;
|
||||||
pid_t memserver_pid;
|
pid_t memserver_pid;
|
||||||
|
|
||||||
@@ -712,21 +711,18 @@ memserver_fault(int sig) {
|
|||||||
|
|
||||||
ssize_t __attribute__((noinline))
|
ssize_t __attribute__((noinline))
|
||||||
memserver_read(void *to, const void *from, size_t len) {
|
memserver_read(void *to, const void *from, size_t len) {
|
||||||
if (memserver_has_ptrace) {
|
/* Earlier versions of this code tried to use process_vm_readv() if they
|
||||||
// This won't run for older Android APIs anyway, but it can't be compiled
|
detected that CAP_SYS_PTRACE was enabled. This is theoretically
|
||||||
// either, as process_vm_readv() isn't available.
|
slightly safer than using signals and memcpy(), but in practice it
|
||||||
#if !(defined(__ANDROID_API__) && __ANDROID_API__ < 23)
|
turns out that some kernels don't support process_vm_readv() even
|
||||||
struct iovec local = { to, len };
|
when CAP_SYS_PTRACE is enabled.
|
||||||
struct iovec remote = { const_cast<void *>(from), len };
|
|
||||||
return process_vm_readv(memserver_pid, &local, 1, &remote, 1, 0);
|
It seems simpler just to use the signal handlers instead. */
|
||||||
#endif
|
if (!sigsetjmp(memserver_fault_buf, 1)) {
|
||||||
|
memcpy(to, from, len);
|
||||||
|
return len;
|
||||||
} else {
|
} else {
|
||||||
if (!sigsetjmp(memserver_fault_buf, 1)) {
|
return -1;
|
||||||
memcpy(to, from, len);
|
|
||||||
return len;
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -739,21 +735,12 @@ memserver_entry(void *dummy __attribute__((unused))) {
|
|||||||
prctl(PR_SET_NAME, "[backtrace]");
|
prctl(PR_SET_NAME, "[backtrace]");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// process_vm_readv() is not available for older Android APIs.
|
struct sigaction sa;
|
||||||
#if defined(__ANDROID_API__) && __ANDROID_API__ < 23
|
sigfillset(&sa.sa_mask);
|
||||||
memserver_has_ptrace = false;
|
sa.sa_handler = memserver_fault;
|
||||||
#else
|
sa.sa_flags = SA_NODEFER;
|
||||||
memserver_has_ptrace = !!prctl(PR_CAPBSET_READ, CAP_SYS_PTRACE);
|
sigaction(SIGSEGV, &sa, NULL);
|
||||||
#endif
|
sigaction(SIGBUS, &sa, NULL);
|
||||||
|
|
||||||
if (!memserver_has_ptrace) {
|
|
||||||
struct sigaction sa;
|
|
||||||
sigfillset(&sa.sa_mask);
|
|
||||||
sa.sa_handler = memserver_fault;
|
|
||||||
sa.sa_flags = SA_NODEFER;
|
|
||||||
sigaction(SIGSEGV, &sa, NULL);
|
|
||||||
sigaction(SIGBUS, &sa, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
struct memserver_req req;
|
struct memserver_req req;
|
||||||
|
|||||||
Reference in New Issue
Block a user