projects
/
GitHub
/
exynos8895
/
android_kernel_samsung_universal8895.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
6ce4eac
)
tracing: Allow events to have NULL strings
author
Steven Rostedt (Red Hat)
<rostedt@goodmis.org>
Tue, 26 Nov 2013 14:22:54 +0000
(09:22 -0500)
committer
Steven Rostedt
<rostedt@goodmis.org>
Tue, 26 Nov 2013 15:34:46 +0000
(10:34 -0500)
If an TRACE_EVENT() uses __assign_str() or __get_str on a NULL pointer
then the following oops will happen:
BUG: unable to handle kernel NULL pointer dereference at (null)
IP: [<
c127a17b
>] strlen+0x10/0x1a
*pde =
00000000
^M
Oops: 0000 [#1] PREEMPT SMP
Modules linked in:
CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.13.0-rc1-test+ #2
Hardware name: /DG965MQ, BIOS MQ96510J.86A.0372.2006.0605.1717 06/05/2006^M
task:
f5cde9f0
ti:
f5e5e000
task.ti:
f5e5e000
EIP: 0060:[<
c127a17b
>] EFLAGS:
00210046
CPU: 1
EIP is at strlen+0x10/0x1a
EAX:
00000000
EBX:
c2472da8
ECX:
ffffffff
EDX:
c2472da8
ESI:
c1c5e5fc
EDI:
00000000
EBP:
f5e5fe84
ESP:
f5e5fe80
DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
CR0:
8005003b
CR2:
00000000
CR3:
01f32000
CR4:
000007d0
Stack:
f5f18b90
f5e5feb8
c10687a8
0759004f
00000005
00000005
00000005
00200046
00000002
00000000
c1082a93
f56c7e28
c2472da8
c1082a93
f5e5fee4
c106bc61
^M
00000000
c1082a93
00000000
00000000
00000001
00200046
00200082
00000000
Call Trace:
[<
c10687a8
>] ftrace_raw_event_lock+0x39/0xc0
[<
c1082a93
>] ? ktime_get+0x29/0x69
[<
c1082a93
>] ? ktime_get+0x29/0x69
[<
c106bc61
>] lock_release+0x57/0x1a5
[<
c1082a93
>] ? ktime_get+0x29/0x69
[<
c10824dd
>] read_seqcount_begin.constprop.7+0x4d/0x75
[<
c1082a93
>] ? ktime_get+0x29/0x69^M
[<
c1082a93
>] ktime_get+0x29/0x69
[<
c108a46a
>] __tick_nohz_idle_enter+0x1e/0x426
[<
c10690e8
>] ? lock_release_holdtime.part.19+0x48/0x4d
[<
c10bc184
>] ? time_hardirqs_off+0xe/0x28
[<
c1068c82
>] ? trace_hardirqs_off_caller+0x3f/0xaf
[<
c108a8cb
>] tick_nohz_idle_enter+0x59/0x62
[<
c1079242
>] cpu_startup_entry+0x64/0x192
[<
c102299c
>] start_secondary+0x277/0x27c
Code: 90 89 c6 89 d0 88 c4 ac 38 e0 74 09 84 c0 75 f7 be 01 00 00 00 89 f0 48 5e 5d c3 55 89 e5 57 66 66 66 66 90 83 c9 ff 89 c7 31 c0 <f2> ae f7 d1 8d 41 ff 5f 5d c3 55 89 e5 57 66 66 66 66 90 31 ff
EIP: [<
c127a17b
>] strlen+0x10/0x1a SS:ESP 0068:
f5e5fe80
CR2:
0000000000000000
---[ end trace
01bc47bf519ec1b2
]---
New tracepoints have been added that have allowed for NULL pointers
being assigned to strings. To fix this, change the TRACE_EVENT() code
to check for NULL and if it is, it will assign "(null)" to it instead
(similar to what glibc printf does).
Reported-by: Shuah Khan <shuah.kh@samsung.com>
Reported-by: Jovi Zhangwei <jovi.zhangwei@gmail.com>
Link:
http://lkml.kernel.org/r/CAGdX0WFeEuy+DtpsJzyzn0343qEEjLX97+o1VREFkUEhndC+5Q@mail.gmail.com
Link:
http://lkml.kernel.org/r/528D6972.9010702@samsung.com
Fixes:
9cbf117662e2
("tracing/events: provide string with undefined size support")
Cc: stable@vger.kernel.org # 2.6.31+
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
include/trace/ftrace.h
patch
|
blob
|
blame
|
history
diff --git
a/include/trace/ftrace.h
b/include/trace/ftrace.h
index 52594b20179e0d8459a0810c7fbcc75fceda84ff..d17a35c6537e615a384e2cd006f37b4a2828a55a 100644
(file)
--- a/
include/trace/ftrace.h
+++ b/
include/trace/ftrace.h
@@
-372,7
+372,8
@@
ftrace_define_fields_##call(struct ftrace_event_call *event_call) \
__data_size += (len) * sizeof(type);
#undef __string
__data_size += (len) * sizeof(type);
#undef __string
-#define __string(item, src) __dynamic_array(char, item, strlen(src) + 1)
+#define __string(item, src) __dynamic_array(char, item, \
+ strlen((src) ? (const char *)(src) : "(null)") + 1)
#undef DECLARE_EVENT_CLASS
#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
#undef DECLARE_EVENT_CLASS
#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
@@
-501,7
+502,7
@@
static inline notrace int ftrace_get_offsets_##call( \
#undef __assign_str
#define __assign_str(dst, src) \
#undef __assign_str
#define __assign_str(dst, src) \
- strcpy(__get_str(dst),
src
);
+ strcpy(__get_str(dst),
(src) ? (const char *)(src) : "(null)"
);
#undef TP_fast_assign
#define TP_fast_assign(args...) args
#undef TP_fast_assign
#define TP_fast_assign(args...) args