From 696c58f9f0f2f8570c2437ad9a0b4b58a92d7346 Mon Sep 17 00:00:00 2001 From: practicalswift Date: Tue, 3 Nov 2015 14:11:49 +0100 Subject: [PATCH 1/2] Add test case for segfault-on-emu_stop() bug. The following code segfaults: unicorn.Uc(unicorn.UC_ARCH_X86, unicorn.UC_MODE_64).emu_stop() Tested under Linux and OS X. --- tests/regress/segfault_on_stop.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100755 tests/regress/segfault_on_stop.py diff --git a/tests/regress/segfault_on_stop.py b/tests/regress/segfault_on_stop.py new file mode 100755 index 00000000..8d577109 --- /dev/null +++ b/tests/regress/segfault_on_stop.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python + +import regress +import unicorn + + +class SegfaultOnStop(regress.RegressTest): + def test(self): + unicorn.Uc(unicorn.UC_ARCH_X86, unicorn.UC_MODE_64).emu_stop() + self.assertTrue(True, "If not reached, then we have a crashing bug.") + +if __name__ == '__main__': + regress.main() From 4151d1d60087558e8adac8f01df97b25f7c4b22f Mon Sep 17 00:00:00 2001 From: practicalswift Date: Tue, 3 Nov 2015 14:34:31 +0100 Subject: [PATCH 2/2] Fix segfault-on-emu_stop() bug. --- uc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/uc.c b/uc.c index 00efc805..e3107b70 100644 --- a/uc.c +++ b/uc.c @@ -525,8 +525,10 @@ uc_err uc_emu_stop(uc_engine *uc) return UC_ERR_OK; uc->stop_request = true; - // exit the current TB - cpu_exit(uc->current_cpu); + if (uc->current_cpu) { + // exit the current TB + cpu_exit(uc->current_cpu); + } return UC_ERR_OK; }