Skip to content

Commit fea6885

Browse files
committed
make it possible to choose between crashing methods
1 parent d714ccf commit fea6885

File tree

5 files changed

+28
-10
lines changed

5 files changed

+28
-10
lines changed

include/libafl/exit.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ void libafl_exit_request_internal(CPUState* cpu, uint64_t pc,
8080
void libafl_exit_request_breakpoint(CPUState* cpu, target_ulong pc);
8181
void libafl_exit_request_custom_insn(CPUState* cpu, target_ulong pc,
8282
enum libafl_custom_insn_kind kind);
83-
void libafl_exit_request_crash(void);
83+
void libafl_exit_request_crash(CPUState* cpu);
8484
void libafl_exit_request_timeout(void);
8585

8686
struct libafl_exit_reason* libafl_get_exit_reason(void);

include/libafl/user.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ uint64_t libafl_set_brk(uint64_t new_brk);
4949

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

52+
bool libafl_get_return_on_crash(void);
53+
void libafl_set_return_on_crash(bool return_on_crash);
54+
5255
#ifdef AS_LIB
5356
void libafl_qemu_init(int argc, char** argv);
5457
#endif

libafl/exit.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,16 +126,15 @@ void libafl_exit_request_breakpoint(CPUState* cpu, target_ulong pc)
126126
prepare_qemu_exit(cpu, pc);
127127
}
128128

129-
void libafl_exit_request_crash(void)
129+
void libafl_exit_request_crash(CPUState* cpu)
130130
{
131-
CPUClass* cc = CPU_GET_CLASS(current_cpu);
131+
CPUClass* cc = CPU_GET_CLASS(cpu);
132132

133133
expected_exit = true;
134134
last_exit_reason.kind = CRASH;
135-
last_exit_reason.cpu = current_cpu;
135+
last_exit_reason.cpu = cpu;
136136

137-
// TODO: put real PC
138-
prepare_qemu_exit(current_cpu, cc->get_pc(current_cpu));
137+
prepare_qemu_exit(current_cpu, cc->get_pc(cpu));
139138
}
140139

141140
#ifndef CONFIG_USER_ONLY

libafl/user.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44

55
#include "libafl/user.h"
66

7+
extern abi_ulong target_brk, initial_target_brk;
8+
79
static struct image_info libafl_image_info;
810

9-
struct libafl_qemu_sig_ctx libafl_qemu_sig_ctx = {0};
11+
static struct libafl_qemu_sig_ctx libafl_qemu_sig_ctx = {0};
1012

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

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

@@ -54,6 +58,14 @@ uint64_t libafl_set_brk(uint64_t new_brk)
5458
return old_brk;
5559
}
5660

61+
void libafl_set_return_on_crash(bool return_on_crash) {
62+
libafl_return_on_crash = return_on_crash;
63+
}
64+
65+
bool libafl_get_return_on_crash(void) {
66+
return libafl_return_on_crash;
67+
}
68+
5769
#ifdef AS_LIB
5870
void libafl_qemu_init(int argc, char** argv)
5971
{

linux-user/signal.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,9 +1286,13 @@ static void handle_pending_signal(CPUArchState *cpu_env, int sig,
12861286
sig != TARGET_SIGWINCH &&
12871287
sig != TARGET_SIGCONT) {
12881288
//// --- Start LibAFL code ---
1289-
// dump_core_and_abort(cpu_env, sig);
1290-
libafl_exit_request_crash();
1289+
if (libafl_get_return_on_crash()) {
1290+
libafl_exit_request_crash(env_cpu(cpu_env));
1291+
} else {
1292+
dump_core_and_abort(cpu_env, sig);
1293+
}
12911294
//// --- End LibAFL code ---
1295+
// dump_core_and_abort(cpu_env, sig);
12921296
}
12931297
} else if (handler == TARGET_SIG_IGN) {
12941298
/* ignore sig */

0 commit comments

Comments
 (0)