[Top] [All Lists]

Re: [RFC PATCH] kernel/signal.c: avoid BUG_ON with SIG128 (MIPS)

To: James Hogan <>
Subject: Re: [RFC PATCH] kernel/signal.c: avoid BUG_ON with SIG128 (MIPS)
From: David Daney <>
Date: Wed, 29 May 2013 10:19:32 -0700
Cc:,, Ralf Baechle <>, Al Viro <>, Andrew Morton <>, Oleg Nesterov <>, Kees Cook <>
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed;; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=DqNdopBX7P/sLKx3ImUv26B035cHsY1opiPMQSu7DZM=; b=l1c3UwrNyGIMBgiRcMJNpGJ5fMgMYg8/PCZdeYzsHmkTNVeVdmZG32ZMjs9Tjk81Iy KYpZGXiqi1/q4vAR2PUvOQlFUSELadU69ODtL9uUtjwwep4pnLxTymfxzg0N+WhEjnyI +kb4UJX/XeiTFHQSnKEfwg21B8uapQBo4ay5DdC0DkVsYL5/+ftRLNoZMNBC93MvGsM2 ye757xfTX6iuj8DBcjG5CKc3UP5fjJ9Y/CpvqlhsuXitSQzSe70ivVwCde3SnMOUeMEQ UQC/ja1En1l+CCsrbStiJW4ok6yLsioybn9+x91ITwZwhiCuq8WzWdkkCDd+wPXgVtFw rfaQ==
In-reply-to: <>
List-archive: <>
List-help: <>
List-id: linux-mips <>
List-owner: <>
List-post: <>
List-software: Ecartis version 1.0.0
List-subscribe: <>
List-unsubscribe: <>
Original-recipient: rfc822;
References: <>
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130311 Thunderbird/17.0.4
On 05/29/2013 10:01 AM, James Hogan wrote:
MIPS has 128 signals, the highest of which has the number 128. The

I wonder if we should change the ABI and reduce the number of signals to 127 instead of this patch.

David Daney

following command causes get_signal_to_deliver() to pass this signal
number straight through to do_group_exit() as the exit code:

   strace sleep 10 & sleep 1 && kill -128 `pidof sleep`

However do_group_exit() checks for the core dump bit (0x80) in the exit
code which matches in this particular case and the kernel panics:

   BUG_ON(exit_code & 0x80); /* core dumps don't get here */

This is worked around by changing get_signal_to_deliver() to pass
min(info->si_signo, 127) instead of info->si_signo, so that this highest
of signal numbers get rounded down to 127. This makes the exit code
technically incorrect, but it's better than killing the whole kernel.

Signed-off-by: James Hogan <>
Cc: Ralf Baechle <>
Cc: Al Viro <>
Cc: Andrew Morton <>
Cc: Oleg Nesterov <>
Cc: Kees Cook <>

This is based on v3.10-rc3.

It's a little hacky, but aside from reducing the number of signals to
127 to avoid this case (which isn't backwards compatible) I'm not sure
what else can be done. Any comments?

  kernel/signal.c | 6 +++++-
  1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/kernel/signal.c b/kernel/signal.c
index 113411b..69bc00f 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2366,8 +2366,12 @@ relock:

                 * Death signals, no core dump.
+                *
+                * MIPS has a signal number 128 which clashes with the core dump
+                * bit. If this was the signal we still want to report a valid
+                * exit code, so round it down to 127.
-               do_group_exit(info->si_signo);
+               do_group_exit(min(info->si_signo, 127));
                /* NOTREACHED */

<Prev in Thread] Current Thread [Next in Thread>