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: H. Peter Anvin <hpa@zytor.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
ed7b1889da
commit
6e16d89bcd
18 changed files with 18 additions and 22 deletions
|
@ -172,8 +172,7 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file,
|
|||
has_dumped = 1;
|
||||
current->flags |= PF_DUMPCORE;
|
||||
strncpy(dump.u_comm, current->comm, sizeof(current->comm));
|
||||
dump.u_ar0 = (u32)(((unsigned long)(&dump.regs)) -
|
||||
((unsigned long)(&dump)));
|
||||
dump.u_ar0 = offsetof(struct user32, regs);
|
||||
dump.signal = signr;
|
||||
dump_thread32(regs, &dump);
|
||||
|
||||
|
|
|
@ -115,7 +115,7 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file, u
|
|||
current->flags |= PF_DUMPCORE;
|
||||
strncpy(dump.u_comm, current->comm, sizeof(dump.u_comm));
|
||||
#ifndef __sparc__
|
||||
dump.u_ar0 = (void *)(((unsigned long)(&dump.regs)) - ((unsigned long)(&dump)));
|
||||
dump.u_ar0 = offsetof(struct user, regs);
|
||||
#endif
|
||||
dump.signal = signr;
|
||||
dump_thread(regs, &dump);
|
||||
|
|
|
@ -39,7 +39,7 @@ struct user {
|
|||
unsigned long start_data; /* data starting address */
|
||||
unsigned long start_stack; /* stack starting address */
|
||||
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 */
|
||||
char u_comm[32]; /* user command name */
|
||||
};
|
||||
|
|
|
@ -67,7 +67,7 @@ struct user{
|
|||
esp register. */
|
||||
long int signal; /* Signal that caused the core dump. */
|
||||
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. */
|
||||
unsigned long magic; /* To uniquely identify a core file */
|
||||
char u_comm[32]; /* User command that was responsible */
|
||||
|
|
|
@ -51,7 +51,7 @@ struct user {
|
|||
unsigned long start_data; /* data starting address */
|
||||
unsigned long start_stack; /* stack starting address */
|
||||
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 */
|
||||
char u_comm[32]; /* user command name */
|
||||
};
|
||||
|
|
|
@ -75,7 +75,7 @@ struct user {
|
|||
esp register. */
|
||||
long int signal; /* Signal that caused the core dump. */
|
||||
int reserved; /* No longer used */
|
||||
struct user_regs_struct *u_ar0;
|
||||
unsigned long u_ar0;
|
||||
/* Used by gdb to help find the values for */
|
||||
/* the registers. */
|
||||
unsigned long magic; /* To uniquely identify a core file */
|
||||
|
|
|
@ -38,7 +38,7 @@ struct user {
|
|||
unsigned long start_data; /* data starting address */
|
||||
unsigned long start_stack; /* stack starting address */
|
||||
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 */
|
||||
char u_comm[32]; /* user command name */
|
||||
};
|
||||
|
|
|
@ -62,8 +62,7 @@ struct user{
|
|||
esp register. */
|
||||
long int signal; /* Signal that caused the core dump. */
|
||||
int reserved; /* No longer used */
|
||||
struct user_regs_struct *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. */
|
||||
unsigned long magic; /* To uniquely identify a core file */
|
||||
char u_comm[32]; /* User command that was responsible */
|
||||
|
|
|
@ -44,7 +44,7 @@ struct user {
|
|||
unsigned long start_data; /* data starting address */
|
||||
unsigned long start_stack; /* stack starting address */
|
||||
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 */
|
||||
char u_comm[32]; /* user command name */
|
||||
};
|
||||
|
|
|
@ -38,7 +38,7 @@ struct user {
|
|||
unsigned long start_data; /* data starting address */
|
||||
unsigned long start_stack; /* stack starting address */
|
||||
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 */
|
||||
char u_comm[32]; /* user command name */
|
||||
};
|
||||
|
|
|
@ -72,8 +72,7 @@ struct user{
|
|||
esp register. */
|
||||
long int signal; /* Signal that caused the core dump. */
|
||||
int reserved; /* No longer used */
|
||||
struct user_regs_struct *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. */
|
||||
struct user_m68kfp_struct* u_fpstate; /* Math Co-processor pointer. */
|
||||
unsigned long magic; /* To uniquely identify a core file */
|
||||
|
|
|
@ -44,7 +44,7 @@ struct user {
|
|||
unsigned long start_data; /* data starting address */
|
||||
unsigned long start_stack; /* stack starting address */
|
||||
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 */
|
||||
char u_comm[32]; /* user command name */
|
||||
};
|
||||
|
|
|
@ -38,7 +38,7 @@ struct user {
|
|||
unsigned long start_data; /* data starting address */
|
||||
unsigned long start_stack; /* stack starting address */
|
||||
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 */
|
||||
char u_comm[32]; /* user command name */
|
||||
};
|
||||
|
|
|
@ -63,8 +63,7 @@ struct user {
|
|||
the top of the stack is always found in the
|
||||
esp register. */
|
||||
long int signal; /* Signal that caused the core dump. */
|
||||
struct user_regs_struct *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. */
|
||||
unsigned long magic; /* To uniquely identify a core file */
|
||||
char u_comm[32]; /* User command that was responsible */
|
||||
|
|
|
@ -52,7 +52,7 @@ struct user {
|
|||
unsigned long start_data; /* data starting address */
|
||||
unsigned long start_stack; /* stack starting address */
|
||||
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 */
|
||||
unsigned long magic; /* identifies a core file */
|
||||
char u_comm[32]; /* user command name */
|
||||
|
|
|
@ -38,7 +38,7 @@ struct user {
|
|||
unsigned long start_data; /* data starting address */
|
||||
unsigned long start_stack; /* stack starting address */
|
||||
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 */
|
||||
char u_comm[32]; /* user command name */
|
||||
};
|
||||
|
|
|
@ -116,7 +116,7 @@ struct user{
|
|||
esp register. */
|
||||
long int signal; /* Signal that caused the core dump. */
|
||||
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. */
|
||||
struct user_i387_struct* u_fpstate; /* Math Co-processor pointer. */
|
||||
unsigned long magic; /* To uniquely identify a core file */
|
||||
|
|
|
@ -118,7 +118,7 @@ struct user{
|
|||
long int signal; /* Signal that caused the core dump. */
|
||||
int reserved; /* No longer used */
|
||||
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. */
|
||||
struct user_i387_struct* u_fpstate; /* Math Co-processor pointer. */
|
||||
unsigned long magic; /* To uniquely identify a core file */
|
||||
|
|
Loading…
Reference in a new issue