Skip to content

Commit

Permalink
[PATCH] x86_64: Display meaningful part of filename during BUG()
Browse files Browse the repository at this point in the history
When building in a separate objtree, file names produced by BUG() & Co. can
get fairly long; printing only the first 50 characters may thus result in
(almost) no useful information. The following change makes it so that rather
the last 50 characters of the filename get printed.

Signed-Off-By: Jan Beulich <jbeulich@novell.com>

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Jan Beulich authored and Linus Torvalds committed Jan 12, 2006
1 parent 1b2f630 commit 5f1d189
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 7 deletions.
12 changes: 9 additions & 3 deletions arch/x86_64/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,8 @@ void show_registers(struct pt_regs *regs)
void handle_BUG(struct pt_regs *regs)
{
struct bug_frame f;
char tmp;
long len;
const char *prefix = "";

if (user_mode(regs))
return;
Expand All @@ -350,10 +351,15 @@ void handle_BUG(struct pt_regs *regs)
if (f.filename >= 0 ||
f.ud2[0] != 0x0f || f.ud2[1] != 0x0b)
return;
if (__get_user(tmp, (char *)(long)f.filename))
len = __strnlen_user((char *)(long)f.filename, PATH_MAX) - 1;
if (len < 0 || len >= PATH_MAX)
f.filename = (int)(long)"unmapped filename";
else if (len > 50) {
f.filename += len - 50;
prefix = "...";
}
printk("----------- [cut here ] --------- [please bite here ] ---------\n");
printk(KERN_ALERT "Kernel BUG at %.50s:%d\n", (char *)(long)f.filename, f.line);
printk(KERN_ALERT "Kernel BUG at %s%.50s:%d\n", prefix, (char *)(long)f.filename, f.line);
}

#ifdef CONFIG_BUG
Expand Down
12 changes: 8 additions & 4 deletions arch/x86_64/lib/usercopy.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,14 +109,11 @@ unsigned long clear_user(void __user *to, unsigned long n)
* Return 0 on exception, a value greater than N if too long
*/

long strnlen_user(const char __user *s, long n)
long __strnlen_user(const char __user *s, long n)
{
long res = 0;
char c;

if (!access_ok(VERIFY_READ, s, n))
return 0;

while (1) {
if (res>n)
return n+1;
Expand All @@ -129,6 +126,13 @@ long strnlen_user(const char __user *s, long n)
}
}

long strnlen_user(const char __user *s, long n)
{
if (!access_ok(VERIFY_READ, s, n))
return 0;
return __strnlen_user(s, n);
}

long strlen_user(const char __user *s)
{
long res = 0;
Expand Down
1 change: 1 addition & 0 deletions include/asm-x86_64/uaccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,7 @@ static inline int __copy_in_user(void __user *dst, const void __user *src, unsig
long strncpy_from_user(char *dst, const char __user *src, long count);
long __strncpy_from_user(char *dst, const char __user *src, long count);
long strnlen_user(const char __user *str, long n);
long __strnlen_user(const char __user *str, long n);
long strlen_user(const char __user *str);
unsigned long clear_user(void __user *mem, unsigned long len);
unsigned long __clear_user(void __user *mem, unsigned long len);
Expand Down

0 comments on commit 5f1d189

Please sign in to comment.