summaryrefslogtreecommitdiff
path: root/patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch')
-rw-r--r--patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch240
1 files changed, 240 insertions, 0 deletions
diff --git a/patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch b/patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch
new file mode 100644
index 0000000..6d62315
--- /dev/null
+++ b/patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch
@@ -0,0 +1,240 @@
+--- ltrace-0.5.2.orig/TODO
++++ ltrace-0.5.2/TODO
+@@ -37,3 +37,4 @@
+ * debug: change "-d" option to be something like "-d elf,events", or "-d breakpoints"
+ * Find out if a process is sharing memory with its parent?
+ * When using -p, find out if that process is sharing memory with other procs
++* After a clone(), syscalls may be seen as sysrets in s390 (see trace.c:syscall_p())
+--- ltrace-0.5.2.orig/process_event.c
++++ ltrace-0.5.2/process_event.c
+@@ -170,7 +170,7 @@
+ enable_breakpoint(proc->pid, proc->breakpoint_being_enabled);
+ proc->breakpoint_being_enabled = NULL;
+ }
+- if (proc->parent->state == STATE_ATTACHED && options.follow) {
++ if (options.follow) {
+ proc->state = STATE_ATTACHED;
+ } else {
+ proc->state = STATE_IGNORED;
+--- ltrace-0.5.2.orig/sysdeps/linux-gnu/ppc/trace.c
++++ ltrace-0.5.2/sysdeps/linux-gnu/ppc/trace.c
+@@ -50,9 +50,9 @@
+ *sysnum =
+ (int)ptrace(PTRACE_PEEKUSER, proc->pid,
+ sizeof(long) * PT_R0, 0);
+- if (proc->callstack_depth > 0
+- && proc->callstack[proc->callstack_depth -
+- 1].is_syscall) {
++ if (proc->callstack_depth > 0 &&
++ proc->callstack[proc->callstack_depth - 1].is_syscall &&
++ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
+ return 2;
+ }
+ return 1;
+--- ltrace-0.5.2.orig/sysdeps/linux-gnu/i386/trace.c
++++ ltrace-0.5.2/sysdeps/linux-gnu/i386/trace.c
+@@ -32,7 +32,8 @@
+ *sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 4 * ORIG_EAX, 0);
+
+ if (proc->callstack_depth > 0 &&
+- proc->callstack[proc->callstack_depth - 1].is_syscall) {
++ proc->callstack[proc->callstack_depth - 1].is_syscall &&
++ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
+ return 2;
+ }
+
+--- ltrace-0.5.2.orig/sysdeps/linux-gnu/ia64/trace.c
++++ ltrace-0.5.2/sysdeps/linux-gnu/ia64/trace.c
+@@ -106,8 +106,8 @@
+ if (insn == 0x1000000000 || insn == 0x1ffffffffff) {
+ *sysnum = r15;
+ if (proc->callstack_depth > 0 &&
+- proc->callstack[proc->callstack_depth -
+- 1].is_syscall) {
++ proc->callstack[proc->callstack_depth - 1].is_syscall &&
++ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
+ return 2;
+ }
+ return 1;
+--- ltrace-0.5.2.orig/sysdeps/linux-gnu/m68k/trace.c
++++ ltrace-0.5.2/sysdeps/linux-gnu/m68k/trace.c
+@@ -36,9 +36,8 @@
+ if (*sysnum >= 0) {
+ depth = proc->callstack_depth;
+ if (depth > 0 &&
+- proc->callstack[depth - 1].is_syscall &&
+- proc->callstack[depth - 1].c_un.syscall ==
+- *sysnum) {
++ proc->callstack[depth - 1].is_syscall &&
++ proc->callstack[depth - 1].c_un.syscall == *sysnum) {
+ return 2;
+ } else {
+ return 1;
+--- ltrace-0.5.2.orig/sysdeps/linux-gnu/alpha/trace.c
++++ ltrace-0.5.2/sysdeps/linux-gnu/alpha/trace.c
+@@ -36,8 +36,9 @@
+ return 0;
+ *sysnum =
+ ptrace(PTRACE_PEEKUSER, proc->pid, 0 /* REG_R0 */ , 0);
+- if (proc->callstack_depth > 0
+- && proc->callstack[proc->callstack_depth - 1].is_syscall) {
++ if (proc->callstack_depth > 0 &&
++ proc->callstack[proc->callstack_depth - 1].is_syscall &&
++ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
+ return 2;
+ }
+ if (*sysnum >= 0 && *sysnum < 500) {
+--- ltrace-0.5.2.orig/sysdeps/linux-gnu/sparc/trace.c
++++ ltrace-0.5.2/sysdeps/linux-gnu/sparc/trace.c
+@@ -33,9 +33,9 @@
+ insn = ptrace(PTRACE_PEEKTEXT, proc->pid, ip, 0);
+ if ((insn & 0xc1f8007f) == 0x81d00010) {
+ *sysnum = ((proc_archdep *) proc->arch_ptr)->regs.r_g1;
+- if ((proc->callstack_depth > 0)
+- && proc->callstack[proc->callstack_depth -
+- 1].is_syscall) {
++ if (proc->callstack_depth > 0 &&
++ proc->callstack[proc->callstack_depth - 1].is_syscall &&
++ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
+ return 2;
+ } else if (*sysnum >= 0) {
+ return 1;
+--- ltrace-0.5.2.orig/sysdeps/linux-gnu/mipsel/trace.c
++++ ltrace-0.5.2/sysdeps/linux-gnu/mipsel/trace.c
+@@ -60,33 +60,34 @@
+ int
+ syscall_p(Process *proc, int status, int *sysnum) {
+ if (WIFSTOPPED(status)
+- && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
+- /* get the user's pc (plus 8) */
+- long pc = (long)get_instruction_pointer(proc);
+- /* fetch the SWI instruction */
+- int insn = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 4, 0);
+- int num = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 8, 0);
+-
+-/*
+- On a mipsel, syscall looks like:
+- 24040fa1 li v0, 0x0fa1 # 4001 --> _exit syscall
+- 0000000c syscall
+- */
+- if(insn!=0x0000000c){
+- return 0;
+- }
+-
+- *sysnum = (num & 0xFFFF) - 4000;
+- /* if it is a syscall, return 1 or 2 */
+- if (proc->callstack_depth > 0 &&
+- proc->callstack[proc->callstack_depth - 1].is_syscall) {
+- return 2;
+- }
+-
+- if (*sysnum >= 0) {
+- return 1;
+- }
+- }
++ && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
++ /* get the user's pc (plus 8) */
++ long pc = (long)get_instruction_pointer(proc);
++ /* fetch the SWI instruction */
++ int insn = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 4, 0);
++ int num = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 8, 0);
++
++ /*
++ On a mipsel, syscall looks like:
++ 24040fa1 li v0, 0x0fa1 # 4001 --> _exit syscall
++ 0000000c syscall
++ */
++ if(insn!=0x0000000c){
++ return 0;
++ }
++
++ *sysnum = (num & 0xFFFF) - 4000;
++ /* if it is a syscall, return 1 or 2 */
++ if (proc->callstack_depth > 0 &&
++ proc->callstack[proc->callstack_depth - 1].is_syscall &&
++ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
++ return 2;
++ }
++
++ if (*sysnum >= 0) {
++ return 1;
++ }
++ }
+ return 0;
+ }
+ /**
+@@ -119,34 +120,34 @@
+ */
+ long
+ gimme_arg(enum tof type, Process *proc, int arg_num, arg_type_info *info) {
+- long ret;
+- debug(2,"type %d arg %d",type,arg_num);
+- if (type == LT_TOF_FUNCTION || type == LT_TOF_SYSCALL){
+- if(arg_num <4){
+- ret=ptrace(PTRACE_PEEKUSER,proc->pid,off_a0+arg_num,0);
+- debug(2,"ret = %#lx",ret);
+- return ret;
+- } else {
+- // If we need this, I think we can look at [sp+16] for arg_num==4.
+- CP;
+- return 0;
+- }
+- }
+- if(arg_num>=0){
+- fprintf(stderr,"args on return?");
+- }
+- if(type == LT_TOF_FUNCTIONR) {
+- return ptrace(PTRACE_PEEKUSER,proc->pid,off_v0,0);
+- }
+- if (type == LT_TOF_SYSCALLR) {
+- unsigned a3=ptrace(PTRACE_PEEKUSER, proc->pid,off_a3,0);
+- unsigned v0=ptrace(PTRACE_PEEKUSER, proc->pid,off_v0,0);
+- if(!a3){
+- return v0;
+- }
+- return -1;
+- }
+- fprintf(stderr, "gimme_arg called with wrong arguments\n");
++ long ret;
++ debug(2,"type %d arg %d",type,arg_num);
++ if (type == LT_TOF_FUNCTION || type == LT_TOF_SYSCALL){
++ if(arg_num <4){
++ ret=ptrace(PTRACE_PEEKUSER,proc->pid,off_a0+arg_num,0);
++ debug(2,"ret = %#lx",ret);
++ return ret;
++ } else {
++ // If we need this, I think we can look at [sp+16] for arg_num==4.
++ CP;
++ return 0;
++ }
++ }
++ if(arg_num>=0){
++ fprintf(stderr,"args on return?");
++ }
++ if(type == LT_TOF_FUNCTIONR) {
++ return ptrace(PTRACE_PEEKUSER,proc->pid,off_v0,0);
++ }
++ if (type == LT_TOF_SYSCALLR) {
++ unsigned a3=ptrace(PTRACE_PEEKUSER, proc->pid,off_a3,0);
++ unsigned v0=ptrace(PTRACE_PEEKUSER, proc->pid,off_v0,0);
++ if(!a3){
++ return v0;
++ }
++ return -1;
++ }
++ fprintf(stderr, "gimme_arg called with wrong arguments\n");
+ return 0;
+ }
+
+--- ltrace-0.5.2.orig/sysdeps/linux-gnu/x86_64/trace.c
++++ ltrace-0.5.2/sysdeps/linux-gnu/x86_64/trace.c
+@@ -41,7 +41,8 @@
+ *sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 8 * ORIG_RAX, 0);
+
+ if (proc->callstack_depth > 0 &&
+- proc->callstack[proc->callstack_depth - 1].is_syscall) {
++ proc->callstack[proc->callstack_depth - 1].is_syscall &&
++ proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
+ return 2;
+ }
+