summaryrefslogtreecommitdiffstats
path: root/x86-code-dump-fix-truncation.patch
blob: a20f181d78960ad7b685cc45fac18b28d3d4ff5b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
After this patch, kernel code dumps have been sometimes truncated
in the system log:

 commit 9d90c8d9cde929cbc575098e825d7c29d9f45054
 "printk: do not mangle valid userspace syslog prefixes"

The new code is interpreting the bracketed code byte as a loglevel
when it happens to have a legal value for that. Fix it by prefixing
the output with a space.

Signed-off-by: Chuck Ebbert <cebbert@redhat.com>
---
RHBZ #736815

--- a/arch/x86/kernel/dumpstack_32.c
+++ b/arch/x86/kernel/dumpstack_32.c
@@ -105,7 +105,7 @@ void show_registers(struct pt_regs *regs
 		printk(KERN_EMERG "Stack:\n");
 		show_stack_log_lvl(NULL, regs, &regs->sp, 0, KERN_EMERG);
 
-		printk(KERN_EMERG "Code: ");
+		printk(KERN_EMERG "Code:");
 
 		ip = (u8 *)regs->ip - code_prologue;
 		if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) {
@@ -116,13 +116,13 @@ void show_registers(struct pt_regs *regs
 		for (i = 0; i < code_len; i++, ip++) {
 			if (ip < (u8 *)PAGE_OFFSET ||
 					probe_kernel_address(ip, c)) {
-				printk(" Bad EIP value.");
+				printk("  Bad EIP value.");
 				break;
 			}
 			if (ip == (u8 *)regs->ip)
-				printk("<%02x> ", c);
+				printk(" <%02x>", c);
 			else
-				printk("%02x ", c);
+				printk(" %02x", c);
 		}
 	}
 	printk("\n");
--- a/arch/x86/kernel/dumpstack_64.c
+++ b/arch/x86/kernel/dumpstack_64.c
@@ -273,7 +273,7 @@ void show_registers(struct pt_regs *regs
 		show_stack_log_lvl(NULL, regs, (unsigned long *)sp,
 				   0, KERN_EMERG);
 
-		printk(KERN_EMERG "Code: ");
+		printk(KERN_EMERG "Code:");
 
 		ip = (u8 *)regs->ip - code_prologue;
 		if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) {
@@ -284,13 +284,13 @@ void show_registers(struct pt_regs *regs
 		for (i = 0; i < code_len; i++, ip++) {
 			if (ip < (u8 *)PAGE_OFFSET ||
 					probe_kernel_address(ip, c)) {
-				printk(" Bad RIP value.");
+				printk("  Bad RIP value.");
 				break;
 			}
 			if (ip == (u8 *)regs->ip)
-				printk("<%02x> ", c);
+				printk(" <%02x>", c);
 			else
-				printk("%02x ", c);
+				printk(" %02x", c);
 		}
 	}
 	printk("\n");