Skip to content

Add crash exit request #106

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 14, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions include/libafl/exit.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ enum libafl_exit_reason_kind {
INTERNAL = 0,
BREAKPOINT = 1,
CUSTOM_INSN = 2,
TIMEOUT = 3,
CRASH = 3,
TIMEOUT = 4,
};

enum libafl_custom_insn_kind {
Expand All @@ -39,6 +40,10 @@ struct libafl_exit_reason_custom_insn {
enum libafl_custom_insn_kind kind;
};

// A timeout occured and we were asked to exit on timeout
struct libafl_exit_reason_crash {
};

// A timeout occured and we were asked to exit on timeout
struct libafl_exit_reason_timeout {
};
Expand All @@ -52,6 +57,7 @@ struct libafl_exit_reason {
struct libafl_exit_reason_breakpoint breakpoint; // kind == BREAKPOINT
struct libafl_exit_reason_custom_insn
custom_insn; // kind == CUSTOM_INSN
struct libafl_exit_reason_crash crash; // kind == CRASH
struct libafl_exit_reason_timeout timeout; // kind == TIMEOUT
} data;
};
Expand All @@ -74,9 +80,7 @@ void libafl_exit_request_internal(CPUState* cpu, uint64_t pc,
void libafl_exit_request_breakpoint(CPUState* cpu, target_ulong pc);
void libafl_exit_request_custom_insn(CPUState* cpu, target_ulong pc,
enum libafl_custom_insn_kind kind);

#ifndef CONFIG_USER_ONLY
void libafl_exit_request_crash(CPUState* cpu);
void libafl_exit_request_timeout(void);
#endif

struct libafl_exit_reason* libafl_get_exit_reason(void);
3 changes: 3 additions & 0 deletions include/libafl/user.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ uint64_t libafl_set_brk(uint64_t new_brk);

int _libafl_qemu_user_init(int argc, char** argv, char** envp);

bool libafl_get_return_on_crash(void);
void libafl_set_return_on_crash(bool return_on_crash);

#ifdef AS_LIB
void libafl_qemu_init(int argc, char** argv);
#endif
11 changes: 11 additions & 0 deletions libafl/exit.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,17 @@ void libafl_exit_request_breakpoint(CPUState* cpu, target_ulong pc)
prepare_qemu_exit(cpu, pc);
}

void libafl_exit_request_crash(CPUState* cpu)
{
CPUClass* cc = CPU_GET_CLASS(cpu);

expected_exit = true;
last_exit_reason.kind = CRASH;
last_exit_reason.cpu = cpu;

prepare_qemu_exit(current_cpu, cc->get_pc(cpu));
}

#ifndef CONFIG_USER_ONLY
void libafl_exit_request_timeout(void)
{
Expand Down
16 changes: 14 additions & 2 deletions libafl/user.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@

#include "libafl/user.h"

extern abi_ulong target_brk, initial_target_brk;

static struct image_info libafl_image_info;

struct libafl_qemu_sig_ctx libafl_qemu_sig_ctx = {0};
static struct libafl_qemu_sig_ctx libafl_qemu_sig_ctx = {0};

extern abi_ulong target_brk, initial_target_brk;
// if true, target crashes will issue an exit request and return to harness.
// if false, target crahes will raise the appropriate signal.
static bool libafl_return_on_crash = false;

void host_signal_handler(int host_sig, siginfo_t* info, void* puc);

Expand Down Expand Up @@ -54,6 +58,14 @@ uint64_t libafl_set_brk(uint64_t new_brk)
return old_brk;
}

void libafl_set_return_on_crash(bool return_on_crash) {
libafl_return_on_crash = return_on_crash;
}

bool libafl_get_return_on_crash(void) {
return libafl_return_on_crash;
}

#ifdef AS_LIB
void libafl_qemu_init(int argc, char** argv)
{
Expand Down
10 changes: 9 additions & 1 deletion linux-user/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
//// --- Begin LibAFL code ---

#include "libafl/user.h"
#include "libafl/exit.h"

//// --- End LibAFL code ---

Expand Down Expand Up @@ -1284,7 +1285,14 @@ static void handle_pending_signal(CPUArchState *cpu_env, int sig,
sig != TARGET_SIGURG &&
sig != TARGET_SIGWINCH &&
sig != TARGET_SIGCONT) {
dump_core_and_abort(cpu_env, sig);
//// --- Start LibAFL code ---
if (libafl_get_return_on_crash()) {
libafl_exit_request_crash(env_cpu(cpu_env));
} else {
dump_core_and_abort(cpu_env, sig);
}
//// --- End LibAFL code ---
// dump_core_and_abort(cpu_env, sig);
}
} else if (handler == TARGET_SIG_IGN) {
/* ignore sig */
Expand Down
Loading