aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/kernel/traps.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/kernel/traps.c')
-rw-r--r--arch/x86_64/kernel/traps.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c
index d345c712c6ca..2671fd46ea85 100644
--- a/arch/x86_64/kernel/traps.c
+++ b/arch/x86_64/kernel/traps.c
@@ -340,7 +340,8 @@ bad:
340void handle_BUG(struct pt_regs *regs) 340void handle_BUG(struct pt_regs *regs)
341{ 341{
342 struct bug_frame f; 342 struct bug_frame f;
343 char tmp; 343 long len;
344 const char *prefix = "";
344 345
345 if (user_mode(regs)) 346 if (user_mode(regs))
346 return; 347 return;
@@ -350,10 +351,15 @@ void handle_BUG(struct pt_regs *regs)
350 if (f.filename >= 0 || 351 if (f.filename >= 0 ||
351 f.ud2[0] != 0x0f || f.ud2[1] != 0x0b) 352 f.ud2[0] != 0x0f || f.ud2[1] != 0x0b)
352 return; 353 return;
353 if (__get_user(tmp, (char *)(long)f.filename)) 354 len = __strnlen_user((char *)(long)f.filename, PATH_MAX) - 1;
355 if (len < 0 || len >= PATH_MAX)
354 f.filename = (int)(long)"unmapped filename"; 356 f.filename = (int)(long)"unmapped filename";
357 else if (len > 50) {
358 f.filename += len - 50;
359 prefix = "...";
360 }
355 printk("----------- [cut here ] --------- [please bite here ] ---------\n"); 361 printk("----------- [cut here ] --------- [please bite here ] ---------\n");
356 printk(KERN_ALERT "Kernel BUG at %.50s:%d\n", (char *)(long)f.filename, f.line); 362 printk(KERN_ALERT "Kernel BUG at %s%.50s:%d\n", prefix, (char *)(long)f.filename, f.line);
357} 363}
358 364
359#ifdef CONFIG_BUG 365#ifdef CONFIG_BUG