From f085ed36d6be3e886536cbb1d4f1bd18fde5ee60 Mon Sep 17 00:00:00 2001 From: mllken Date: Wed, 8 Mar 2023 15:02:35 +0700 Subject: [PATCH 1/4] std.os.linux: add ptrace and associated constants --- lib/std/os/linux.zig | 63 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index b151e5f235d5..a04514e4568a 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -1820,6 +1820,16 @@ pub fn seccomp(operation: u32, flags: u32, args: ?*const anyopaque) usize { return syscall3(.seccomp, operation, flags, @ptrToInt(args)); } +pub fn ptrace(request: i32, pid: pid_t, addr: ?[*]u8, data: usize) usize { + return syscall4( + .ptrace, + @bitCast(usize, @as(isize, request)), + @bitCast(usize, @as(isize, pid)), + @ptrToInt(addr), + data, + ); +} + pub const E = switch (native_arch) { .mips, .mipsel => @import("linux/errno/mips.zig").E, .sparc, .sparcel, .sparc64 => @import("linux/errno/sparc.zig").E, @@ -1943,6 +1953,59 @@ pub const PROT = struct { pub const GROWSUP = 0x02000000; }; +pub const PTRACE = struct { + pub const TRACEME = 0; + pub const PEEKTEXT = 1; + pub const PEEKDATA = 2; + pub const PEEKUSER = 3; + pub const POKETEXT = 4; + pub const POKEDATA = 5; + pub const POKEUSER = 6; + pub const CONT = 7; + pub const KILL = 8; + pub const SINGLESTEP = 9; + pub const GETREGS = 12; + pub const SETREGS = 13; + pub const GETFPREGS = 14; + pub const SETFPREGS = 15; + pub const ATTACH = 16; + pub const DETACH = 17; + pub const GETFPXREGS = 18; + pub const SETFPXREGS = 19; + pub const SYSCALL = 24; + + pub const SETOPTIONS = 0x4200; + pub const GETEVENTMSG = 0x4201; + pub const GETSIGINFO = 0x4202; + pub const SETSIGINFO = 0x4203; + pub const GETREGSET = 0x4204; + pub const SETREGSET = 0x4205; + pub const SEIZE = 0x4206; + pub const INTERRUPT = 0x4207; + pub const LISTEN = 0x4208; + pub const PEEKSIGINFO = 0x4209; + pub const GETSIGMASK = 0x420a; + pub const SETSIGMASK = 0x420b; + pub const SECCOMP_GET_FILTER = 0x420c; + pub const SECCOMP_GET_METADATA = 0x420d; + pub const GET_SYSCALL_INFO = 0x420e; + pub const GET_RSEQ_CONFIGURATION = 0x420f; + + pub const O = struct { + pub const TRACESYSGOOD = 0x00000001; + pub const TRACEFORK = 0x00000002; + pub const TRACEVFORK = 0x00000004; + pub const TRACECLONE = 0x00000008; + pub const TRACEEXEC = 0x00000010; + pub const TRACEVFORKDONE = 0x00000020; + pub const TRACEEXIT = 0x00000040; + pub const TRACESECCOMP = 0x00000080; + pub const EXITKILL = 0x00100000; + pub const SUSPEND_SECCOMP = 0x00200000; + pub const MASK = 0x003000ff; + }; +}; + pub const FD_CLOEXEC = 1; pub const F_OK = 0; From 694f0dc274641ce791f5eb0d48314394c36dd5bd Mon Sep 17 00:00:00 2001 From: mllken Date: Wed, 8 Mar 2023 17:49:37 +0700 Subject: [PATCH 2/4] add high level Linux ptrace api in os/ptrace.zig --- lib/std/os/ptrace.zig | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/std/os/ptrace.zig b/lib/std/os/ptrace.zig index afe0b51e2e6f..1fe20ec7cf26 100644 --- a/lib/std/os/ptrace.zig +++ b/lib/std/os/ptrace.zig @@ -25,4 +25,21 @@ const ptrace = if (builtin.target.isDarwin()) struct { else => |err| return unexpectedErrno(err), } } +} else if (builtin.target.os.tag == .linux) struct { + pub const PtraceError = error{ + ProcessNotFound, + PermissionDenied, + InputOutput, + } || UnexpectedError; + + pub fn ptrace(request: i32, pid: pid_t, addr: ?[*]u8, data: usize) PtraceError!void { + switch (errno(system.ptrace(request, pid, addr, data))) { + .SUCCESS => return, + .SRCH => return error.ProcessNotFound, + .INVAL, .FAULT, .BUSY => unreachable, + .PERM => return error.PermissionDenied, + .IO => return error.InputOutput, + else => |err| return unexpectedErrno(err), + } + } } else struct {}; From 8f314bd624fe52451b92c8583824011a4cd3d4b2 Mon Sep 17 00:00:00 2001 From: mllken Date: Wed, 8 Mar 2023 20:25:30 +0700 Subject: [PATCH 3/4] Revert "add high level Linux ptrace api in os/ptrace.zig" This reverts commit 694f0dc274641ce791f5eb0d48314394c36dd5bd. --- lib/std/os/ptrace.zig | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/lib/std/os/ptrace.zig b/lib/std/os/ptrace.zig index 1fe20ec7cf26..afe0b51e2e6f 100644 --- a/lib/std/os/ptrace.zig +++ b/lib/std/os/ptrace.zig @@ -25,21 +25,4 @@ const ptrace = if (builtin.target.isDarwin()) struct { else => |err| return unexpectedErrno(err), } } -} else if (builtin.target.os.tag == .linux) struct { - pub const PtraceError = error{ - ProcessNotFound, - PermissionDenied, - InputOutput, - } || UnexpectedError; - - pub fn ptrace(request: i32, pid: pid_t, addr: ?[*]u8, data: usize) PtraceError!void { - switch (errno(system.ptrace(request, pid, addr, data))) { - .SUCCESS => return, - .SRCH => return error.ProcessNotFound, - .INVAL, .FAULT, .BUSY => unreachable, - .PERM => return error.PermissionDenied, - .IO => return error.InputOutput, - else => |err| return unexpectedErrno(err), - } - } } else struct {}; From d608378812a3f3f0d0f2f61c43ed6ce51a7be9b3 Mon Sep 17 00:00:00 2001 From: mllken Date: Fri, 10 Mar 2023 13:06:02 +0700 Subject: [PATCH 4/4] make addr usize instead of ?[*]u8 --- lib/std/os/linux.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index a04514e4568a..71266c57407d 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -1820,12 +1820,12 @@ pub fn seccomp(operation: u32, flags: u32, args: ?*const anyopaque) usize { return syscall3(.seccomp, operation, flags, @ptrToInt(args)); } -pub fn ptrace(request: i32, pid: pid_t, addr: ?[*]u8, data: usize) usize { +pub fn ptrace(request: i32, pid: pid_t, addr: usize, data: usize) usize { return syscall4( .ptrace, @bitCast(usize, @as(isize, request)), @bitCast(usize, @as(isize, pid)), - @ptrToInt(addr), + addr, data, ); }