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 <dvlasenk@redhat.com>
This commit is contained in:
Denys Vlasenko 2011-06-23 21:57:54 +02:00
parent 65d7c4d66c
commit c133bf0eb2

19
util.c
View File

@ -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;
}