Exemple #1
0
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;
}
Exemple #2
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;
}