Skip to contentSkip to conversation

x86: signal_32: introduce retcode and rt_retcode

PATCH In review Hiroshi Shimamoto 5 participants 11 messages Nov 12, 2008 – Nov 13, 2008 x86

lore
Share & tools
lore
#0 lore raw

PATCH 1/2 x86: signal_32: introduce retcode and rt_retcode

From: Hiroshi Shimamoto <[email protected]>

Impact: cleanup

Introduce retcode and rt_retcode to replace setting up frame->retcode.

---
 arch/x86/kernel/signal_32.c |   30 ++++++++++++++++++++++++------
 1 files changed, 24 insertions(+), 6 deletions(-)
arch/x86/kernel/signal_32.c +24 -6
index 27a5c81..514171a 100644
@@ -45,6 +45,28 @@
 # define FIX_EFLAGS	__FIX_EFLAGS
 #endif
 
+static const struct {
+	u16 poplmovl;
+	u32 val;
+	u16 int80;
+} __attribute__((packed)) retcode = {
+	0xb858,		/* popl %eax; movl $..., %eax */
+	__NR_sigreturn,
+	0x80cd,		/* int $0x80 */
+};
+
+static const struct {
+	u8  movl;
+	u32 val;
+	u16 int80;
+	u8  pad;
+} __attribute__((packed)) rt_retcode = {
+	0xb8,		/* movl $..., %eax */
+	__NR_rt_sigreturn,
+	0x80cd,		/* int $0x80 */
+	0
+};
+
 /*
  * Atomically swap in the new signal mask, and wait for a signal.
  */
@@ -427,9 +449,7 @@ __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
 	 * reasons and because gdb uses it as a signature to notice
 	 * signal handler stack frames.
 	 */
-	err |= __put_user(0xb858, (short __user *)(frame->retcode+0));
-	err |= __put_user(__NR_sigreturn, (int __user *)(frame->retcode+2));
-	err |= __put_user(0x80cd, (short __user *)(frame->retcode+6));
+	err |= __put_user(*((u64 *)&retcode), (u64 *)frame->retcode);
 
 	if (err)
 		return -EFAULT;
@@ -498,9 +518,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 	 * reasons and because gdb uses it as a signature to notice
 	 * signal handler stack frames.
 	 */
-	err |= __put_user(0xb8, (char __user *)(frame->retcode+0));
-	err |= __put_user(__NR_rt_sigreturn, (int __user *)(frame->retcode+1));
-	err |= __put_user(0x80cd, (short __user *)(frame->retcode+5));
+	err |= __put_user(*((u64 *)&rt_retcode), (u64 *)frame->retcode);
 
 	if (err)
 		return -EFAULT;
Signature · 1 line
1.5.6
#1 lore raw

PATCH 2/2 x86: ia32_signal: remove unnecessary padding

From: Hiroshi Shimamoto <[email protected]>

Impact: cleanup

Remove unnecessary paddings, this saves 4 bytes.

---
 arch/x86/ia32/ia32_signal.c |    5 +----
 1 files changed, 1 insertions(+), 4 deletions(-)
arch/x86/ia32/ia32_signal.c +1 -4
index bafc0b4..e886907 100644
@@ -427,12 +427,10 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
 		u16 poplmovl;
 		u32 val;
 		u16 int80;
-		u16 pad;
 	} __attribute__((packed)) code = {
 		0xb858,		 /* popl %eax ; movl $...,%eax */
 		__NR_ia32_sigreturn,
 		0x80cd,		/* int $0x80 */
-		0,
 	};
 
 	frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
@@ -508,8 +506,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 		u8 movl;
 		u32 val;
 		u16 int80;
-		u16 pad;
-		u8  pad2;
+		u8  pad;
 	} __attribute__((packed)) code = {
 		0xb8,
 		__NR_ia32_rt_sigreturn,
Signature · 1 line
1.5.6
#2 lore raw

Re: [PATCH 2/2] x86: ia32_signal: remove unnecessary padding

Quoted 10 lines · Hiroshi Shimamoto

From: Hiroshi Shimamoto <[email protected]>

Impact: cleanup

Remove unnecessary paddings, this saves 4 bytes.

---
 arch/x86/ia32/ia32_signal.c |    5 +----
 1 files changed, 1 insertions(+), 4 deletions(-)

applied your patches to tip/x86/signal:

9cc3c49: x86: ia32_signal: remove unnecessary padding 4a61204: x86: signal_32: introduce retcode and rt_retcode

thanks!

A question - this change:

Quoted 14 lines
arch/x86/ia32/ia32_signal.c +0 -2
@@ -427,12 +427,10 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
 		u16 poplmovl;
 		u32 val;
 		u16 int80;
-		u16 pad;
 	} __attribute__((packed)) code = {
 		0xb858,		 /* popl %eax ; movl $...,%eax */
 		__NR_ia32_sigreturn,
 		0x80cd,		/* int $0x80 */
-		0,
 	};
 
 	frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);

arch/x86/ia32/ia32_signal.c int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, · line 512

Quoted 9 lines
arch/x86/ia32/ia32_signal.c +1 -2
@@ -508,8 +506,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 		u8 movl;
 		u32 val;
 		u16 int80;
-		u16 pad;
-		u8  pad2;
+		u8  pad;
 	} __attribute__((packed)) code = {
 		0xb8,
 		__NR_ia32_rt_sigreturn,

does not impact any ABI, because it's only about the signal trampoline the kernel pushes to the user-space stack - not about any userspace-visible signal frame detail, right?

Ingo

#3 lore raw

Re: [PATCH 2/2] x86: ia32_signal: remove unnecessary padding

Quoted 35 lines · Ingo Molnar
Quoted 10 lines · Hiroshi Shimamoto

From: Hiroshi Shimamoto <[email protected]>

Impact: cleanup

Remove unnecessary paddings, this saves 4 bytes.

---
 arch/x86/ia32/ia32_signal.c |    5 +----
 1 files changed, 1 insertions(+), 4 deletions(-)

applied your patches to tip/x86/signal:

9cc3c49: x86: ia32_signal: remove unnecessary padding 4a61204: x86: signal_32: introduce retcode and rt_retcode

thanks!

A question - this change:

Quoted 12 lines
arch/x86/ia32/ia32_signal.c +0 -2
@@ -427,12 +427,10 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
 		u16 poplmovl;
 		u32 val;
 		u16 int80;
-		u16 pad;
 	} __attribute__((packed)) code = {
 		0xb858,		 /* popl %eax ; movl $...,%eax */
 		__NR_ia32_sigreturn,
 		0x80cd,		/* int $0x80 */
-		0,
 	};
 
Quoted 15 lines

arch/x86/ia32/ia32_signal.c int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, · line 512

Quoted 11 lines
arch/x86/ia32/ia32_signal.c +1 -2
 	frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
@@ -508,8 +506,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 		u8 movl;
 		u32 val;
 		u16 int80;
-		u16 pad;
-		u8  pad2;
+		u8  pad;
 	} __attribute__((packed)) code = {
 		0xb8,
 		__NR_ia32_rt_sigreturn,

does not impact any ABI, because it's only about the signal trampoline the kernel pushes to the user-space stack - not about any userspace-visible signal frame detail, right?

As long as the 'char retcode[8]' field isn't reduced in size (you can _never_ do that!), and the initial instruction sequence up to the 'int $0x80' isn't changed (you can't change that either), I believe this is safe.

It does cause each signal delivery to leak 2 uninitialised kernel bytes to the end of retcode[], which seems unnecessary.

#4 lore raw

Re: [PATCH 2/2] x86: ia32_signal: remove unnecessary padding

Quoted 2 lines · Mikael Pettersson

It does cause each signal delivery to leak 2 uninitialised kernel bytes to the end of retcode[], which seems unnecessary.

Not just unnecessary, it is a huge no-no for security.

NAK on this.

-hpa

#5 lore raw

Re: [PATCH 2/2] x86: ia32_signal: remove unnecessary padding

Quoted 5 lines · H. Peter Anvin
Quoted 2 lines · Mikael Pettersson

It does cause each signal delivery to leak 2 uninitialised kernel bytes to the end of retcode[], which seems unnecessary.

Not just unnecessary, it is a huge no-no for security.

Am I missing important thing?
The frame->retcode is 8 bytes and packed structure with padding is 10 bytes each, and the code is copied to user stack 8 bytes only.

err |= __copy_to_user(frame->retcode, &code, 8);

I don't think the behavior is changed.

thanks,
Hiroshi Shimamoto

Quoted 10 lines

NAK on this.

-hpa
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

#6 lore raw

Re: [PATCH 2/2] x86: ia32_signal: remove unnecessary padding

Quoted 6 lines · Hiroshi Shimamoto
Quoted 4 lines · H. Peter Anvin
Quoted 2 lines · Mikael Pettersson

It does cause each signal delivery to leak 2 uninitialised kernel bytes to the end of retcode[], which seems unnecessary.

Not just unnecessary, it is a huge no-no for security.

Quoted 8 lines

Am I missing important thing?
The frame->retcode is 8 bytes and packed structure with padding is 10 bytes each, and the code is copied to user stack 8 bytes only.

err |= __copy_to_user(frame->retcode, &code, 8);

I don't think the behavior is changed.

Ah, nevermind, then. Then it fine, obviously.

-hpa

#7 lore raw

Re: [PATCH 2/2] x86: ia32_signal: remove unnecessary padding

Quoted 11 lines · H. Peter Anvin
Quoted 10 lines · Hiroshi Shimamoto
Quoted 4 lines · H. Peter Anvin
Quoted 2 lines · Mikael Pettersson

It does cause each signal delivery to leak 2 uninitialised kernel bytes to the end of retcode[], which seems unnecessary.

Not just unnecessary, it is a huge no-no for security.

Am I missing important thing?
The frame->retcode is 8 bytes and packed structure with padding is 10 bytes each, and the code is copied to user stack 8 bytes only.

Quoted 6 lines
Quoted 4 lines

err |= __copy_to_user(frame->retcode, &code, 8);

I don't think the behavior is changed.

Ah, nevermind, then. Then it fine, obviously.

Agreed. I wonder how on earth those templates ended up as 10 bytes large when retcode[] always has been 8 bytes.

#8 lore raw

Re: [PATCH 2/2] x86: ia32_signal: remove unnecessary padding

Quoted 6 lines · Mikael Pettersson
Quoted 2 lines

Ah, nevermind, then. Then it fine, obviously.

Agreed. I wonder how on earth those templates ended up as 10 bytes large when retcode[] always has been 8 bytes.

Probably someone added something and didn't adjust the padding.

-hpa

#9 lore raw

Re: [PATCH 2/2] x86: ia32_signal: remove unnecessary padding

In reply to Hiroshi Shimamoto
Quoted 3 lines · Hiroshi Shimamoto

From: Hiroshi Shimamoto <[email protected]>

Impact: cleanup

Actually it's not a cleanup.

Quoted 1 line

Remove unnecessary paddings, this saves 4 bytes.

This might actually break code. The code is not actually used, but only kept around because some old gdb versions used this code as a marker for detecting signals.

I don't know if they require the padding or not, but it seems somewhat risky to change a legacy marker like this.

-Andi

Signature · 1 line
[email protected]
#10 lore raw

Re: [PATCH 2/2] x86: ia32_signal: remove unnecessary padding

Quoted 6 lines · Andi Kleen
Quoted 3 lines · Hiroshi Shimamoto

From: Hiroshi Shimamoto <[email protected]>

Impact: cleanup

Quoted 7 lines

Actually it's not a cleanup.

Quoted 1 line

Remove unnecessary paddings, this saves 4 bytes.

This might actually break code. The code is not actually used, but only kept around because some old gdb versions used this code as a marker for detecting signals.

I think, this cleanup doesn't change the code copied to user stack. It removes additional 2 bytes from each struct, and these had not been copied to user stack, because the structures were 10 bytes and frame->retcode is 8 bytes.

Thanks,
Hiroshi Shimamoto