From: Denys Vlasenko Date: Thu, 23 Jun 2011 19:57:54 +0000 (+0200) Subject: Untangle a particularly badly obfuscated bit of code. No logic changes. X-Git-Tag: v4.7~351 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c133bf0eb240de31856f82972cf7f6f1e512780b;p=strace Untangle a particularly badly obfuscated bit of code. No logic changes. * util.c (setbpt): Calculate new arg0 in more readable way. Signed-off-by: Denys Vlasenko --- diff --git a/util.c b/util.c index a03ee4e0..06b12fc4 100644 --- a/util.c +++ b/util.c @@ -1494,9 +1494,9 @@ setbpt(struct tcb *tcp) return 0; # endif - case SYS_clone: + case SYS_clone: ; # ifdef SYS_clone2 - case SYS_clone2: + case SYS_clone2: ; # endif /* ia64 calls directly `clone (CLONE_VFORK | CLONE_VM)' contrary to x86 SYS_vfork above. Even on x86 we turn the @@ -1506,12 +1506,12 @@ setbpt(struct tcb *tcp) clear also CLONE_VM but only in the CLONE_VFORK case as otherwise we would break pthread_create. */ - if ((arg_setup(tcp, &state) < 0 - || set_arg0(tcp, &state, - (tcp->u_arg[arg0_index] | CLONE_PTRACE) - & ~(tcp->u_arg[arg0_index] & CLONE_VFORK - ? CLONE_VFORK | CLONE_VM : 0)) < 0 - || arg_finish_change(tcp, &state) < 0)) + long new_arg0 = (tcp->u_arg[arg0_index] | CLONE_PTRACE); + if (new_arg0 & CLONE_VFORK) + new_arg0 &= ~(unsigned long)(CLONE_VFORK | CLONE_VM); + if (arg_setup(tcp, &state) < 0 + || set_arg0(tcp, &state, new_arg0) < 0 + || arg_finish_change(tcp, &state) < 0) return -1; tcp->flags |= TCB_BPTSET; tcp->inst[0] = tcp->u_arg[arg0_index]; @@ -1535,7 +1535,8 @@ clearbpt(struct tcb *tcp) || restore_arg0(tcp, &state, tcp->inst[0]) < 0 || restore_arg1(tcp, &state, tcp->inst[1]) < 0 || arg_finish_change(tcp, &state)) - if (errno != ESRCH) return -1; + if (errno != ESRCH) + return -1; tcp->flags &= ~TCB_BPTSET; return 0; }