From 4b8232d4f0bf5fd9f11ebef2b0f9e8e15f130fb3 Mon Sep 17 00:00:00 2001 From: Kamil Rytarowski Date: Tue, 24 Dec 2019 20:34:58 +0100 Subject: [PATCH] [compiler-rt] Adapt for ptrace(2) changes in NetBSD-9.99.30 Enable compat support for now legacy PT_LWPINFO. Support PT_LWPSTATUS and PT_LWPNEXT. --- .../include/sanitizer/netbsd_syscall_hooks.h | 2 +- .../sanitizer_platform_limits_netbsd.cpp | 14 ++++++++++++ .../sanitizer_platform_limits_netbsd.h | 11 ++++++++++ .../sanitizer_syscalls_netbsd.inc | 22 ++++++++++++++++++- .../utils/generate_netbsd_syscalls.awk | 18 ++++++++++++++- 5 files changed, 64 insertions(+), 3 deletions(-) diff --git a/compiler-rt/include/sanitizer/netbsd_syscall_hooks.h b/compiler-rt/include/sanitizer/netbsd_syscall_hooks.h index 174b4bf06de..370da0ea72e 100644 --- a/compiler-rt/include/sanitizer/netbsd_syscall_hooks.h +++ b/compiler-rt/include/sanitizer/netbsd_syscall_hooks.h @@ -20,7 +20,7 @@ // DO NOT EDIT! THIS FILE HAS BEEN GENERATED! // // Generated with: generate_netbsd_syscalls.awk -// Generated date: 2019-11-01 +// Generated date: 2019-12-24 // Generated from: syscalls.master,v 1.296 2019/09/22 22:59:39 christos Exp // //===----------------------------------------------------------------------===// diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.cpp index 14d479ce7ab..81ec6066743 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.cpp @@ -17,6 +17,7 @@ #define _KMEMUSER #define RAY_DO_SIGLEV +#define __LEGACY_PT_LWPINFO // clang-format off #include @@ -71,6 +72,15 @@ #include #include #include + +// Compat for NetBSD < 9.99.30. +#ifndef PT_LWPSTATUS +#define PT_LWPSTATUS 24 +#endif +#ifndef PT_LWPSTATUS +#define PT_LWPSTATUS 25 +#endif + #include #include #include @@ -292,6 +302,8 @@ int ptrace_pt_get_event_mask = PT_GET_EVENT_MASK; int ptrace_pt_get_process_state = PT_GET_PROCESS_STATE; int ptrace_pt_set_siginfo = PT_SET_SIGINFO; int ptrace_pt_get_siginfo = PT_GET_SIGINFO; +int ptrace_pt_lwpstatus = PT_LWPSTATUS; +int ptrace_pt_lwpnext = PT_LWPNEXT; int ptrace_piod_read_d = PIOD_READ_D; int ptrace_piod_write_d = PIOD_WRITE_D; int ptrace_piod_read_i = PIOD_READ_I; @@ -324,6 +336,8 @@ int ptrace_pt_getdbregs = -1; unsigned struct_ptrace_ptrace_io_desc_struct_sz = sizeof(struct ptrace_io_desc); unsigned struct_ptrace_ptrace_lwpinfo_struct_sz = sizeof(struct ptrace_lwpinfo); +unsigned struct_ptrace_ptrace_lwpstatus_struct_sz = + sizeof(struct __sanitizer_ptrace_lwpstatus); unsigned struct_ptrace_ptrace_event_struct_sz = sizeof(ptrace_event_t); unsigned struct_ptrace_ptrace_siginfo_struct_sz = sizeof(ptrace_siginfo_t); diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.h index 4d7628ec74c..612b34b3e0c 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_netbsd.h @@ -412,6 +412,8 @@ extern int ptrace_pt_get_event_mask; extern int ptrace_pt_get_process_state; extern int ptrace_pt_set_siginfo; extern int ptrace_pt_get_siginfo; +extern int ptrace_pt_lwpstatus; +extern int ptrace_pt_lwpnext; extern int ptrace_piod_read_d; extern int ptrace_piod_write_d; extern int ptrace_piod_read_i; @@ -436,8 +438,17 @@ struct __sanitizer_ptrace_lwpinfo { int pl_event; }; +struct __sanitizer_ptrace_lwpstatus { + __sanitizer_lwpid_t pl_lwpid; + __sanitizer_sigset_t pl_sigpend; + __sanitizer_sigset_t pl_sigmask; + char pl_name[20]; + void *pl_private; +}; + extern unsigned struct_ptrace_ptrace_io_desc_struct_sz; extern unsigned struct_ptrace_ptrace_lwpinfo_struct_sz; +extern unsigned struct_ptrace_ptrace_lwpstatus_struct_sz; extern unsigned struct_ptrace_ptrace_event_struct_sz; extern unsigned struct_ptrace_ptrace_siginfo_struct_sz; diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_syscalls_netbsd.inc b/compiler-rt/lib/sanitizer_common/sanitizer_syscalls_netbsd.inc index 69e59871874..02b7e11b167 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_syscalls_netbsd.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_syscalls_netbsd.inc @@ -42,7 +42,7 @@ // DO NOT EDIT! THIS FILE HAS BEEN GENERATED! // // Generated with: generate_netbsd_syscalls.awk -// Generated date: 2019-11-01 +// Generated date: 2019-12-24 // Generated from: syscalls.master,v 1.296 2019/09/22 22:59:39 christos Exp // //===----------------------------------------------------------------------===// @@ -323,6 +323,16 @@ PRE_SYSCALL(ptrace) PRE_READ(addr_, struct_ptrace_ptrace_siginfo_struct_sz); } else if (req_ == ptrace_pt_get_siginfo) { PRE_WRITE(addr_, struct_ptrace_ptrace_siginfo_struct_sz); + } else if (req_ == ptrace_pt_lwpstatus) { + struct __sanitizer_ptrace_lwpstatus *addr = + (struct __sanitizer_ptrace_lwpstatus *)addr_; + PRE_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t)); + PRE_WRITE(addr, struct_ptrace_ptrace_lwpstatus_struct_sz); + } else if (req_ == ptrace_pt_lwpnext) { + struct __sanitizer_ptrace_lwpstatus *addr = + (struct __sanitizer_ptrace_lwpstatus *)addr_; + PRE_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t)); + PRE_WRITE(addr, struct_ptrace_ptrace_lwpstatus_struct_sz); } else if (req_ == ptrace_pt_setregs) { PRE_READ(addr_, struct_ptrace_reg_struct_sz); } else if (req_ == ptrace_pt_getregs) { @@ -366,6 +376,16 @@ POST_SYSCALL(ptrace) POST_READ(addr_, struct_ptrace_ptrace_siginfo_struct_sz); } else if (req_ == ptrace_pt_get_siginfo) { POST_WRITE(addr_, struct_ptrace_ptrace_siginfo_struct_sz); + } else if (req_ == ptrace_pt_lwpstatus) { + struct __sanitizer_ptrace_lwpstatus *addr = + (struct __sanitizer_ptrace_lwpstatus *)addr_; + POST_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t)); + POST_WRITE(addr, struct_ptrace_ptrace_lwpstatus_struct_sz); + } else if (req_ == ptrace_pt_lwpnext) { + struct __sanitizer_ptrace_lwpstatus *addr = + (struct __sanitizer_ptrace_lwpstatus *)addr_; + POST_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t)); + POST_WRITE(addr, struct_ptrace_ptrace_lwpstatus_struct_sz); } else if (req_ == ptrace_pt_setregs) { POST_READ(addr_, struct_ptrace_reg_struct_sz); } else if (req_ == ptrace_pt_getregs) { diff --git a/compiler-rt/utils/generate_netbsd_syscalls.awk b/compiler-rt/utils/generate_netbsd_syscalls.awk index 3f6d5a024a6..cc7ba314ea5 100755 --- a/compiler-rt/utils/generate_netbsd_syscalls.awk +++ b/compiler-rt/utils/generate_netbsd_syscalls.awk @@ -19,7 +19,7 @@ # This script will emit compat code for the older releases. # # NetBSD minimal version supported 9.0. -# NetBSD current version supported 9.99.17. +# NetBSD current version supported 9.99.30. # #===------------------------------------------------------------------------===# @@ -733,6 +733,14 @@ function syscall_body(syscall, mode) pcmd(" PRE_READ(addr_, struct_ptrace_ptrace_siginfo_struct_sz);") pcmd("} else if (req_ == ptrace_pt_get_siginfo) {") pcmd(" PRE_WRITE(addr_, struct_ptrace_ptrace_siginfo_struct_sz);") + pcmd("} else if (req_ == ptrace_pt_lwpstatus) {") + pcmd(" struct __sanitizer_ptrace_lwpstatus *addr = (struct __sanitizer_ptrace_lwpstatus *)addr_;") + pcmd(" PRE_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t));") + pcmd(" PRE_WRITE(addr, struct_ptrace_ptrace_lwpstatus_struct_sz);") + pcmd("} else if (req_ == ptrace_pt_lwpnext) {") + pcmd(" struct __sanitizer_ptrace_lwpstatus *addr = (struct __sanitizer_ptrace_lwpstatus *)addr_;") + pcmd(" PRE_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t));") + pcmd(" PRE_WRITE(addr, struct_ptrace_ptrace_lwpstatus_struct_sz);") pcmd("} else if (req_ == ptrace_pt_setregs) {") pcmd(" PRE_READ(addr_, struct_ptrace_reg_struct_sz);") pcmd("} else if (req_ == ptrace_pt_getregs) {") @@ -769,6 +777,14 @@ function syscall_body(syscall, mode) pcmd(" POST_READ(addr_, struct_ptrace_ptrace_siginfo_struct_sz);") pcmd(" } else if (req_ == ptrace_pt_get_siginfo) {") pcmd(" POST_WRITE(addr_, struct_ptrace_ptrace_siginfo_struct_sz);") + pcmd(" } else if (req_ == ptrace_pt_lwpstatus) {") + pcmd(" struct __sanitizer_ptrace_lwpstatus *addr = (struct __sanitizer_ptrace_lwpstatus *)addr_;") + pcmd(" POST_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t));") + pcmd(" POST_WRITE(addr, struct_ptrace_ptrace_lwpstatus_struct_sz);") + pcmd(" } else if (req_ == ptrace_pt_lwpnext) {") + pcmd(" struct __sanitizer_ptrace_lwpstatus *addr = (struct __sanitizer_ptrace_lwpstatus *)addr_;") + pcmd(" POST_READ(&addr->pl_lwpid, sizeof(__sanitizer_lwpid_t));") + pcmd(" POST_WRITE(addr, struct_ptrace_ptrace_lwpstatus_struct_sz);") pcmd(" } else if (req_ == ptrace_pt_setregs) {") pcmd(" POST_READ(addr_, struct_ptrace_reg_struct_sz);") pcmd(" } else if (req_ == ptrace_pt_getregs) {")