patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Feb 21 23:39:46 2011 +0100 (2011-02-21)
changeset 2312 8b9938edd3d8
permissions -rw-r--r--
libc/glibc: add fortify option

By default, recent versions of glibc and eglibc will build some
functions that take format strings (eg. printf, syslog...) with
run-time checks against some format string attacks. This is
called a fortified build.

Unfortunately, this fails somehow while building the instrumented
version of syslog, with some kind of circular dependency...

Disable fortified builds by default, and hide the enabling option
behind EXPERIMENTAL for daring users...

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
     1 --- ltrace-0.5.2.orig/TODO
     2 +++ ltrace-0.5.2/TODO
     3 @@ -37,3 +37,4 @@
     4  * debug: change "-d" option to be something like "-d elf,events", or "-d breakpoints"
     5  * Find out if a process is sharing memory with its parent?
     6  * When using -p, find out if that process is sharing memory with other procs
     7 +* After a clone(), syscalls may be seen as sysrets in s390 (see trace.c:syscall_p())
     8 --- ltrace-0.5.2.orig/process_event.c
     9 +++ ltrace-0.5.2/process_event.c
    10 @@ -170,7 +170,7 @@
    11  			enable_breakpoint(proc->pid, proc->breakpoint_being_enabled);
    12  			proc->breakpoint_being_enabled = NULL;
    13  		}
    14 -		if (proc->parent->state == STATE_ATTACHED && options.follow) {
    15 +		if (options.follow) {
    16  			proc->state = STATE_ATTACHED;
    17  		} else {
    18  			proc->state = STATE_IGNORED;
    19 --- ltrace-0.5.2.orig/sysdeps/linux-gnu/ppc/trace.c
    20 +++ ltrace-0.5.2/sysdeps/linux-gnu/ppc/trace.c
    21 @@ -50,9 +50,9 @@
    22  			*sysnum =
    23  			    (int)ptrace(PTRACE_PEEKUSER, proc->pid,
    24  					sizeof(long) * PT_R0, 0);
    25 -			if (proc->callstack_depth > 0
    26 -			    && proc->callstack[proc->callstack_depth -
    27 -					       1].is_syscall) {
    28 +			if (proc->callstack_depth > 0 &&
    29 +					proc->callstack[proc->callstack_depth - 1].is_syscall &&
    30 +					proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
    31  				return 2;
    32  			}
    33  			return 1;
    34 --- ltrace-0.5.2.orig/sysdeps/linux-gnu/i386/trace.c
    35 +++ ltrace-0.5.2/sysdeps/linux-gnu/i386/trace.c
    36 @@ -32,7 +32,8 @@
    37  		*sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 4 * ORIG_EAX, 0);
    38  
    39  		if (proc->callstack_depth > 0 &&
    40 -		    proc->callstack[proc->callstack_depth - 1].is_syscall) {
    41 +				proc->callstack[proc->callstack_depth - 1].is_syscall &&
    42 +				proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
    43  			return 2;
    44  		}
    45  
    46 --- ltrace-0.5.2.orig/sysdeps/linux-gnu/ia64/trace.c
    47 +++ ltrace-0.5.2/sysdeps/linux-gnu/ia64/trace.c
    48 @@ -106,8 +106,8 @@
    49  		if (insn == 0x1000000000 || insn == 0x1ffffffffff) {
    50  			*sysnum = r15;
    51  			if (proc->callstack_depth > 0 &&
    52 -			    proc->callstack[proc->callstack_depth -
    53 -					    1].is_syscall) {
    54 +				proc->callstack[proc->callstack_depth - 1].is_syscall &&
    55 +				proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
    56  				return 2;
    57  			}
    58  			return 1;
    59 --- ltrace-0.5.2.orig/sysdeps/linux-gnu/m68k/trace.c
    60 +++ ltrace-0.5.2/sysdeps/linux-gnu/m68k/trace.c
    61 @@ -36,9 +36,8 @@
    62  		if (*sysnum >= 0) {
    63  			depth = proc->callstack_depth;
    64  			if (depth > 0 &&
    65 -			    proc->callstack[depth - 1].is_syscall &&
    66 -			    proc->callstack[depth - 1].c_un.syscall ==
    67 -			    *sysnum) {
    68 +					proc->callstack[depth - 1].is_syscall &&
    69 +					proc->callstack[depth - 1].c_un.syscall == *sysnum) {
    70  				return 2;
    71  			} else {
    72  				return 1;
    73 --- ltrace-0.5.2.orig/sysdeps/linux-gnu/alpha/trace.c
    74 +++ ltrace-0.5.2/sysdeps/linux-gnu/alpha/trace.c
    75 @@ -36,8 +36,9 @@
    76  			return 0;
    77  		*sysnum =
    78  		    ptrace(PTRACE_PEEKUSER, proc->pid, 0 /* REG_R0 */ , 0);
    79 -		if (proc->callstack_depth > 0
    80 -		    && proc->callstack[proc->callstack_depth - 1].is_syscall) {
    81 +		if (proc->callstack_depth > 0 &&
    82 +		    proc->callstack[proc->callstack_depth - 1].is_syscall &&
    83 +			proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
    84  			return 2;
    85  		}
    86  		if (*sysnum >= 0 && *sysnum < 500) {
    87 --- ltrace-0.5.2.orig/sysdeps/linux-gnu/sparc/trace.c
    88 +++ ltrace-0.5.2/sysdeps/linux-gnu/sparc/trace.c
    89 @@ -33,9 +33,9 @@
    90  		insn = ptrace(PTRACE_PEEKTEXT, proc->pid, ip, 0);
    91  		if ((insn & 0xc1f8007f) == 0x81d00010) {
    92  			*sysnum = ((proc_archdep *) proc->arch_ptr)->regs.r_g1;
    93 -			if ((proc->callstack_depth > 0)
    94 -			    && proc->callstack[proc->callstack_depth -
    95 -					       1].is_syscall) {
    96 +			if (proc->callstack_depth > 0 &&
    97 +					proc->callstack[proc->callstack_depth - 1].is_syscall &&
    98 +					proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
    99  				return 2;
   100  			} else if (*sysnum >= 0) {
   101  				return 1;
   102 --- ltrace-0.5.2.orig/sysdeps/linux-gnu/mipsel/trace.c
   103 +++ ltrace-0.5.2/sysdeps/linux-gnu/mipsel/trace.c
   104 @@ -60,33 +60,34 @@
   105  int
   106  syscall_p(Process *proc, int status, int *sysnum) {
   107  	if (WIFSTOPPED(status)
   108 -	    && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
   109 -       /* get the user's pc (plus 8) */
   110 -       long pc = (long)get_instruction_pointer(proc);
   111 -       /* fetch the SWI instruction */
   112 -       int insn = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 4, 0);
   113 -       int num = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 8, 0);
   114 -       
   115 -/*
   116 -  On a mipsel,  syscall looks like:
   117 -  24040fa1    li v0, 0x0fa1   # 4001 --> _exit syscall
   118 -  0000000c    syscall
   119 - */
   120 -      if(insn!=0x0000000c){
   121 -          return 0;
   122 -      }
   123 -
   124 -      *sysnum = (num & 0xFFFF) - 4000;
   125 -      /* if it is a syscall, return 1 or 2 */
   126 -      if (proc->callstack_depth > 0 &&
   127 -          proc->callstack[proc->callstack_depth - 1].is_syscall) {
   128 -          return 2;
   129 -      }
   130 -      
   131 -      if (*sysnum >= 0) {
   132 -          return 1;
   133 -      }
   134 -   }
   135 +			&& WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
   136 +		/* get the user's pc (plus 8) */
   137 +		long pc = (long)get_instruction_pointer(proc);
   138 +		/* fetch the SWI instruction */
   139 +		int insn = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 4, 0);
   140 +		int num = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 8, 0);
   141 +
   142 +		/*
   143 +		   On a mipsel,  syscall looks like:
   144 +		   24040fa1    li v0, 0x0fa1   # 4001 --> _exit syscall
   145 +		   0000000c    syscall
   146 +		 */
   147 +		if(insn!=0x0000000c){
   148 +			return 0;
   149 +		}
   150 +
   151 +		*sysnum = (num & 0xFFFF) - 4000;
   152 +		/* if it is a syscall, return 1 or 2 */
   153 +		if (proc->callstack_depth > 0 &&
   154 +				proc->callstack[proc->callstack_depth - 1].is_syscall &&
   155 +				proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
   156 +			return 2;
   157 +		}
   158 +
   159 +		if (*sysnum >= 0) {
   160 +			return 1;
   161 +		}
   162 +	}
   163  	return 0;
   164  }
   165  /**
   166 @@ -119,34 +120,34 @@
   167  */
   168  long
   169  gimme_arg(enum tof type, Process *proc, int arg_num, arg_type_info *info) {
   170 -    long ret;
   171 -    debug(2,"type %d arg %d",type,arg_num);
   172 -    if (type == LT_TOF_FUNCTION || type == LT_TOF_SYSCALL){
   173 -        if(arg_num <4){
   174 -            ret=ptrace(PTRACE_PEEKUSER,proc->pid,off_a0+arg_num,0);
   175 -            debug(2,"ret = %#lx",ret);
   176 -            return ret;
   177 -        } else {
   178 -            // If we need this, I think we can look at [sp+16] for arg_num==4.
   179 -            CP;
   180 -            return 0;
   181 -        }
   182 -    } 
   183 -    if(arg_num>=0){
   184 -       fprintf(stderr,"args on return?");
   185 -    }
   186 -    if(type == LT_TOF_FUNCTIONR) {
   187 -        return  ptrace(PTRACE_PEEKUSER,proc->pid,off_v0,0);
   188 -    }
   189 -    if (type == LT_TOF_SYSCALLR) {
   190 -        unsigned a3=ptrace(PTRACE_PEEKUSER, proc->pid,off_a3,0);
   191 -        unsigned v0=ptrace(PTRACE_PEEKUSER, proc->pid,off_v0,0);
   192 -        if(!a3){
   193 -            return v0;
   194 -        }
   195 -        return -1;
   196 -    }
   197 -    fprintf(stderr, "gimme_arg called with wrong arguments\n");
   198 +	long ret;
   199 +	debug(2,"type %d arg %d",type,arg_num);
   200 +	if (type == LT_TOF_FUNCTION || type == LT_TOF_SYSCALL){
   201 +		if(arg_num <4){
   202 +			ret=ptrace(PTRACE_PEEKUSER,proc->pid,off_a0+arg_num,0);
   203 +			debug(2,"ret = %#lx",ret);
   204 +			return ret;
   205 +		} else {
   206 +			// If we need this, I think we can look at [sp+16] for arg_num==4.
   207 +			CP;
   208 +			return 0;
   209 +		}
   210 +	} 
   211 +	if(arg_num>=0){
   212 +		fprintf(stderr,"args on return?");
   213 +	}
   214 +	if(type == LT_TOF_FUNCTIONR) {
   215 +		return  ptrace(PTRACE_PEEKUSER,proc->pid,off_v0,0);
   216 +	}
   217 +	if (type == LT_TOF_SYSCALLR) {
   218 +		unsigned a3=ptrace(PTRACE_PEEKUSER, proc->pid,off_a3,0);
   219 +		unsigned v0=ptrace(PTRACE_PEEKUSER, proc->pid,off_v0,0);
   220 +		if(!a3){
   221 +			return v0;
   222 +		}
   223 +		return -1;
   224 +	}
   225 +	fprintf(stderr, "gimme_arg called with wrong arguments\n");
   226  	return 0;
   227  }
   228  
   229 --- ltrace-0.5.2.orig/sysdeps/linux-gnu/x86_64/trace.c
   230 +++ ltrace-0.5.2/sysdeps/linux-gnu/x86_64/trace.c
   231 @@ -41,7 +41,8 @@
   232  		*sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 8 * ORIG_RAX, 0);
   233  
   234  		if (proc->callstack_depth > 0 &&
   235 -		    proc->callstack[proc->callstack_depth - 1].is_syscall) {
   236 +				proc->callstack[proc->callstack_depth - 1].is_syscall &&
   237 +				proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
   238  			return 2;
   239  		}
   240