static long tamper_with_syscall_entering(struct tcb *tcp, unsigned int *signo) { if (!tcp->inject_vec[current_personality]) { tcp->inject_vec[current_personality] = xcalloc(nsyscalls, sizeof(**inject_vec)); memcpy(tcp->inject_vec[current_personality], inject_vec[current_personality], nsyscalls * sizeof(**inject_vec)); } struct inject_opts *opts = tcb_inject_opts(tcp); if (!opts || opts->first == 0) return 0; --opts->first; if (opts->first != 0) return 0; opts->first = opts->step; if (opts->data.flags & INJECT_F_SIGNAL) *signo = opts->data.signo; if (opts->data.flags & INJECT_F_RETVAL && !arch_set_scno(tcp, -1)) tcp->flags |= TCB_TAMPERED; return 0; }
static long inject_syscall_fault_entering(struct tcb *tcp, unsigned int *signo) { if (!tcp->fault_vec[current_personality]) { tcp->fault_vec[current_personality] = xcalloc(nsyscalls, sizeof(**fault_vec)); memcpy(tcp->fault_vec[current_personality], fault_vec[current_personality], nsyscalls * sizeof(**fault_vec)); } struct fault_opts *opts = tcb_fault_opts(tcp); if (!opts || opts->first == 0) return 0; --opts->first; if (opts->first != 0) return 0; opts->first = opts->step; if (opts->signo > 0) *signo = opts->signo; if (opts->err != -1 && !arch_set_scno(tcp, -1)) tcp->flags |= TCB_FAULT_INJ; return 0; }