Commit 6e16d89b authored by H. Peter Anvin's avatar H. Peter Anvin Committed by Linus Torvalds

Sanitize the type of struct user.u_ar0

struct user.u_ar0 is defined to contain a pointer offset on all
architectures in which it is defined (all architectures which define an
a.out format except SPARC.) However, it has a pointer type in the headers,
which is pointless -- <asm/user.h> is not exported to userspace, and it
just makes the code messy.

Redefine the field as "unsigned long" (which is the same size as a pointer
on all Linux architectures) and change the setting code to user offsetof()
instead of hand-coded arithmetic.

Cc: Linux Arch Mailing List <linux-arch@vger.kernel.org>
Cc: Bryan Wu <bryan.wu@analog.com>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Lennert Buytenhek <kernel@wantstofly.org>
Cc: Håvard Skinnemoen <hskinnemoen@atmel.com>
Cc: Mikael Starvik <starvik@axis.com>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Paul Mundt <lethal@linux-sh.org>
Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent ed7b1889
...@@ -172,8 +172,7 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file, ...@@ -172,8 +172,7 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file,
has_dumped = 1; has_dumped = 1;
current->flags |= PF_DUMPCORE; current->flags |= PF_DUMPCORE;
strncpy(dump.u_comm, current->comm, sizeof(current->comm)); strncpy(dump.u_comm, current->comm, sizeof(current->comm));
dump.u_ar0 = (u32)(((unsigned long)(&dump.regs)) - dump.u_ar0 = offsetof(struct user32, regs);
((unsigned long)(&dump)));
dump.signal = signr; dump.signal = signr;
dump_thread32(regs, &dump); dump_thread32(regs, &dump);
......
...@@ -115,7 +115,7 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file, u ...@@ -115,7 +115,7 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file, u
current->flags |= PF_DUMPCORE; current->flags |= PF_DUMPCORE;
strncpy(dump.u_comm, current->comm, sizeof(dump.u_comm)); strncpy(dump.u_comm, current->comm, sizeof(dump.u_comm));
#ifndef __sparc__ #ifndef __sparc__
dump.u_ar0 = (void *)(((unsigned long)(&dump.regs)) - ((unsigned long)(&dump))); dump.u_ar0 = offsetof(struct user, regs);
#endif #endif
dump.signal = signr; dump.signal = signr;
dump_thread(regs, &dump); dump_thread(regs, &dump);
......
...@@ -39,7 +39,7 @@ struct user { ...@@ -39,7 +39,7 @@ struct user {
unsigned long start_data; /* data starting address */ unsigned long start_data; /* data starting address */
unsigned long start_stack; /* stack starting address */ unsigned long start_stack; /* stack starting address */
long int signal; /* signal causing core dump */ long int signal; /* signal causing core dump */
struct regs * u_ar0; /* help gdb find registers */ unsigned long u_ar0; /* help gdb find registers */
unsigned long magic; /* identifies a core file */ unsigned long magic; /* identifies a core file */
char u_comm[32]; /* user command name */ char u_comm[32]; /* user command name */
}; };
......
...@@ -67,7 +67,7 @@ struct user{ ...@@ -67,7 +67,7 @@ struct user{
esp register. */ esp register. */
long int signal; /* Signal that caused the core dump. */ long int signal; /* Signal that caused the core dump. */
int reserved; /* No longer used */ int reserved; /* No longer used */
struct pt_regs * u_ar0; /* Used by gdb to help find the values for */ unsigned long u_ar0; /* Used by gdb to help find the values for */
/* the registers. */ /* the registers. */
unsigned long magic; /* To uniquely identify a core file */ unsigned long magic; /* To uniquely identify a core file */
char u_comm[32]; /* User command that was responsible */ char u_comm[32]; /* User command that was responsible */
......
...@@ -51,7 +51,7 @@ struct user { ...@@ -51,7 +51,7 @@ struct user {
unsigned long start_data; /* data starting address */ unsigned long start_data; /* data starting address */
unsigned long start_stack; /* stack starting address */ unsigned long start_stack; /* stack starting address */
long int signal; /* signal causing core dump */ long int signal; /* signal causing core dump */
struct regs * u_ar0; /* help gdb find registers */ unsigned long u_ar0; /* help gdb find registers */
unsigned long magic; /* identifies a core file */ unsigned long magic; /* identifies a core file */
char u_comm[32]; /* user command name */ char u_comm[32]; /* user command name */
}; };
......
...@@ -75,7 +75,7 @@ struct user { ...@@ -75,7 +75,7 @@ struct user {
esp register. */ esp register. */
long int signal; /* Signal that caused the core dump. */ long int signal; /* Signal that caused the core dump. */
int reserved; /* No longer used */ int reserved; /* No longer used */
struct user_regs_struct *u_ar0; unsigned long u_ar0;
/* Used by gdb to help find the values for */ /* Used by gdb to help find the values for */
/* the registers. */ /* the registers. */
unsigned long magic; /* To uniquely identify a core file */ unsigned long magic; /* To uniquely identify a core file */
......
...@@ -38,7 +38,7 @@ struct user { ...@@ -38,7 +38,7 @@ struct user {
unsigned long start_data; /* data starting address */ unsigned long start_data; /* data starting address */
unsigned long start_stack; /* stack starting address */ unsigned long start_stack; /* stack starting address */
long int signal; /* signal causing core dump */ long int signal; /* signal causing core dump */
struct regs * u_ar0; /* help gdb find registers */ unsigned long u_ar0; /* help gdb find registers */
unsigned long magic; /* identifies a core file */ unsigned long magic; /* identifies a core file */
char u_comm[32]; /* user command name */ char u_comm[32]; /* user command name */
}; };
......
...@@ -62,8 +62,7 @@ struct user{ ...@@ -62,8 +62,7 @@ struct user{
esp register. */ esp register. */
long int signal; /* Signal that caused the core dump. */ long int signal; /* Signal that caused the core dump. */
int reserved; /* No longer used */ int reserved; /* No longer used */
struct user_regs_struct *u_ar0; unsigned long u_ar0; /* Used by gdb to help find the values for */
/* Used by gdb to help find the values for */
/* the registers. */ /* the registers. */
unsigned long magic; /* To uniquely identify a core file */ unsigned long magic; /* To uniquely identify a core file */
char u_comm[32]; /* User command that was responsible */ char u_comm[32]; /* User command that was responsible */
......
...@@ -44,7 +44,7 @@ struct user { ...@@ -44,7 +44,7 @@ struct user {
unsigned long start_data; /* data starting address */ unsigned long start_data; /* data starting address */
unsigned long start_stack; /* stack starting address */ unsigned long start_stack; /* stack starting address */
long int signal; /* signal causing core dump */ long int signal; /* signal causing core dump */
struct regs * u_ar0; /* help gdb find registers */ unsigned long u_ar0; /* help gdb find registers */
unsigned long magic; /* identifies a core file */ unsigned long magic; /* identifies a core file */
char u_comm[32]; /* user command name */ char u_comm[32]; /* user command name */
}; };
......
...@@ -38,7 +38,7 @@ struct user { ...@@ -38,7 +38,7 @@ struct user {
unsigned long start_data; /* data starting address */ unsigned long start_data; /* data starting address */
unsigned long start_stack; /* stack starting address */ unsigned long start_stack; /* stack starting address */
long int signal; /* signal causing core dump */ long int signal; /* signal causing core dump */
struct regs * u_ar0; /* help gdb find registers */ unsigned long u_ar0; /* help gdb find registers */
unsigned long magic; /* identifies a core file */ unsigned long magic; /* identifies a core file */
char u_comm[32]; /* user command name */ char u_comm[32]; /* user command name */
}; };
......
...@@ -72,8 +72,7 @@ struct user{ ...@@ -72,8 +72,7 @@ struct user{
esp register. */ esp register. */
long int signal; /* Signal that caused the core dump. */ long int signal; /* Signal that caused the core dump. */
int reserved; /* No longer used */ int reserved; /* No longer used */
struct user_regs_struct *u_ar0; unsigned long u_ar0; /* Used by gdb to help find the values for */
/* Used by gdb to help find the values for */
/* the registers. */ /* the registers. */
struct user_m68kfp_struct* u_fpstate; /* Math Co-processor pointer. */ struct user_m68kfp_struct* u_fpstate; /* Math Co-processor pointer. */
unsigned long magic; /* To uniquely identify a core file */ unsigned long magic; /* To uniquely identify a core file */
......
...@@ -44,7 +44,7 @@ struct user { ...@@ -44,7 +44,7 @@ struct user {
unsigned long start_data; /* data starting address */ unsigned long start_data; /* data starting address */
unsigned long start_stack; /* stack starting address */ unsigned long start_stack; /* stack starting address */
long int signal; /* signal causing core dump */ long int signal; /* signal causing core dump */
struct regs * u_ar0; /* help gdb find registers */ unsigned long u_ar0; /* help gdb find registers */
unsigned long magic; /* identifies a core file */ unsigned long magic; /* identifies a core file */
char u_comm[32]; /* user command name */ char u_comm[32]; /* user command name */
}; };
......
...@@ -38,7 +38,7 @@ struct user { ...@@ -38,7 +38,7 @@ struct user {
unsigned long start_data; /* data starting address */ unsigned long start_data; /* data starting address */
unsigned long start_stack; /* stack starting address */ unsigned long start_stack; /* stack starting address */
long int signal; /* signal causing core dump */ long int signal; /* signal causing core dump */
struct regs * u_ar0; /* help gdb find registers */ unsigned long u_ar0; /* help gdb find registers */
unsigned long magic; /* identifies a core file */ unsigned long magic; /* identifies a core file */
char u_comm[32]; /* user command name */ char u_comm[32]; /* user command name */
}; };
......
...@@ -63,8 +63,7 @@ struct user { ...@@ -63,8 +63,7 @@ struct user {
the top of the stack is always found in the the top of the stack is always found in the
esp register. */ esp register. */
long int signal; /* Signal that caused the core dump. */ long int signal; /* Signal that caused the core dump. */
struct user_regs_struct *u_ar0; unsigned long u_ar0; /* Used by gdb to help find the values for */
/* Used by gdb to help find the values for */
/* the registers. */ /* the registers. */
unsigned long magic; /* To uniquely identify a core file */ unsigned long magic; /* To uniquely identify a core file */
char u_comm[32]; /* User command that was responsible */ char u_comm[32]; /* User command that was responsible */
......
...@@ -52,7 +52,7 @@ struct user { ...@@ -52,7 +52,7 @@ struct user {
unsigned long start_data; /* data starting address */ unsigned long start_data; /* data starting address */
unsigned long start_stack; /* stack starting address */ unsigned long start_stack; /* stack starting address */
long int signal; /* signal causing core dump */ long int signal; /* signal causing core dump */
struct regs * u_ar0; /* help gdb find registers */ unsigned long u_ar0; /* help gdb find registers */
struct user_fpu_struct* u_fpstate; /* Math Co-processor pointer */ struct user_fpu_struct* u_fpstate; /* Math Co-processor pointer */
unsigned long magic; /* identifies a core file */ unsigned long magic; /* identifies a core file */
char u_comm[32]; /* user command name */ char u_comm[32]; /* user command name */
......
...@@ -38,7 +38,7 @@ struct user { ...@@ -38,7 +38,7 @@ struct user {
unsigned long start_data; /* data starting address */ unsigned long start_data; /* data starting address */
unsigned long start_stack; /* stack starting address */ unsigned long start_stack; /* stack starting address */
long int signal; /* signal causing core dump */ long int signal; /* signal causing core dump */
struct regs * u_ar0; /* help gdb find registers */ unsigned long u_ar0; /* help gdb find registers */
unsigned long magic; /* identifies a core file */ unsigned long magic; /* identifies a core file */
char u_comm[32]; /* user command name */ char u_comm[32]; /* user command name */
}; };
......
...@@ -116,7 +116,7 @@ struct user{ ...@@ -116,7 +116,7 @@ struct user{
esp register. */ esp register. */
long int signal; /* Signal that caused the core dump. */ long int signal; /* Signal that caused the core dump. */
int reserved; /* No longer used */ int reserved; /* No longer used */
struct user_pt_regs * u_ar0; /* Used by gdb to help find the values for */ unsigned long u_ar0; /* Used by gdb to help find the values for */
/* the registers. */ /* the registers. */
struct user_i387_struct* u_fpstate; /* Math Co-processor pointer. */ struct user_i387_struct* u_fpstate; /* Math Co-processor pointer. */
unsigned long magic; /* To uniquely identify a core file */ unsigned long magic; /* To uniquely identify a core file */
......
...@@ -118,7 +118,7 @@ struct user{ ...@@ -118,7 +118,7 @@ struct user{
long int signal; /* Signal that caused the core dump. */ long int signal; /* Signal that caused the core dump. */
int reserved; /* No longer used */ int reserved; /* No longer used */
int pad1; int pad1;
struct user_pt_regs * u_ar0; /* Used by gdb to help find the values for */ unsigned long u_ar0; /* Used by gdb to help find the values for */
/* the registers. */ /* the registers. */
struct user_i387_struct* u_fpstate; /* Math Co-processor pointer. */ struct user_i387_struct* u_fpstate; /* Math Co-processor pointer. */
unsigned long magic; /* To uniquely identify a core file */ unsigned long magic; /* To uniquely identify a core file */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment