From e68222df56be2019f4cebbde8d923d80811678c5 Mon Sep 17 00:00:00 2001 From: David Henningsson Date: Tue, 17 Apr 2012 12:28:49 +0200 Subject: [PATCH] jackdbus: Fix sigsegv handling segfaulting by itself In my case, the siginfo code was -6, causing the sigsegv handling to crash on its own. This patch adds a range check for siginfo code. BugLink: https://bugs.launchpad.net/bugs/983835 Signed-off-by: David Henningsson --- dbus/sigsegv.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dbus/sigsegv.c b/dbus/sigsegv.c index 03b1183..8a87dc8 100644 --- a/dbus/sigsegv.c +++ b/dbus/sigsegv.c @@ -60,6 +60,7 @@ static void signal_segv(int signum, siginfo_t* info, void*ptr) { static const char *si_codes[3] = {"", "SEGV_MAPERR", "SEGV_ACCERR"}; size_t i; + const char *si_code_str; ucontext_t *ucontext = (ucontext_t*)ptr; #if defined(SIGSEGV_STACK_X86) || defined(SIGSEGV_STACK_IA64) @@ -94,9 +95,14 @@ static void signal_segv(int signum, siginfo_t* info, void*ptr) { jack_error("Unknown bad signal catched!"); } + if (info->si_code >= 0 && info->si_code < 3) + si_code_str = si_codes[info->si_code]; + else + si_code_str = "unknown"; + jack_error("info.si_signo = %d", signum); jack_error("info.si_errno = %d", info->si_errno); - jack_error("info.si_code = %d (%s)", info->si_code, si_codes[info->si_code]); + jack_error("info.si_code = %d (%s)", info->si_code, si_code_str); jack_error("info.si_addr = %p", info->si_addr); #if !defined(__alpha__) && !defined(__ia64__) && !defined(__FreeBSD_kernel__) && !defined(__arm__) && !defined(__hppa__) && !defined(__sh__) for(i = 0; i < NGREG; i++) -- 1.7.9.5