History

Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull perf fixes from Ingo Molnar: "Misc fixlets" * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: perf: Fix error return code ftrace: Fix strncpy() use, use strlcpy() instead of strncpy() perf: Fix strncpy() use, use strlcpy() instead of strncpy() perf: Fix strncpy() use, always make sure it's NUL terminated perf: Fix ring_buffer perf_output_space() boundary calculation perf/x86: Fix uninitialized pt_regs in intel_pmu_drain_bts_buffer()

Linus Torvalds committed 13 years ago

Commit ae9f4932 parents 93263e5 c4814206 files · +28 −11Browse files

Unified · Split

6 files
  1. arch/x86/kernel/cpu/perf_event_intel_ds.c +2 −1
  2. kernel/events/core.c +3 −1
  3. kernel/events/internal.h +1 −1
  4. kernel/events/ring_buffer.c +18 −4
  5. kernel/trace/ftrace.c +2 −2
  6. kernel/trace/trace.c +2 −2
arch/x86/kernel/cpu/perf_event_intel_ds.c+2−1
@@ -314,10 +314,11 @@ int intel_pmu_drain_bts_buffer(void) · 313 unmodified lines
314314 if (top <= at)
315315 return 0;
316316
317+ memset(&regs, 0, sizeof(regs));
318+
317319 ds->bts_index = ds->bts_buffer_base;
318320
319321 perf_sample_data_init(&data, 0, event->hw.last_period);
320− regs.ip = 0;
321322
322323 /*
323324 * Prepare a generic sample, i.e. fill in the invariant fields.
kernel/events/core.c+3−1
@@ -4737,7 +4737,8 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event) · 4736 unmodified lines
47374737 } else {
47384738 if (arch_vma_name(mmap_event->vma)) {
47394739 name = strncpy(tmp, arch_vma_name(mmap_event->vma),
4740− sizeof(tmp));
4740+ sizeof(tmp) - 1);
4741+ tmp[sizeof(tmp) - 1] = '\0';
47414742 goto got_name;
47424743 }
47434744
@@ -5986,6 +5987,7 @@ skip_type: · 1242 unmodified lines
59865987 if (pmu->pmu_cpu_context)
59875988 goto got_cpu_context;
59885989
5990+ ret = -ENOMEM;
59895991 pmu->pmu_cpu_context = alloc_percpu(struct perf_cpu_context);
59905992 if (!pmu->pmu_cpu_context)
59915993 goto free_dev;
kernel/events/internal.h+1−1
@@ -16,7 +16,7 @@ struct ring_buffer { · 15 unmodified lines
1616 int page_order; /* allocation order */
1717 #endif
1818 int nr_pages; /* nr of data pages */
19− int writable; /* are we writable */
19+ int overwrite; /* can overwrite itself */
2020
2121 atomic_t poll; /* POLL_ for wakeups */
2222
kernel/events/ring_buffer.c+18−4
@@ -18,12 +18,24 @@ · 17 unmodified lines
1818 static bool perf_output_space(struct ring_buffer *rb, unsigned long tail,
1919 unsigned long offset, unsigned long head)
2020 {
21− unsigned long mask;
21+ unsigned long sz = perf_data_size(rb);
22+ unsigned long mask = sz - 1;
2223
23− if (!rb->writable)
24+ /*
25+ * check if user-writable
26+ * overwrite : over-write its own tail
27+ * !overwrite: buffer possibly drops events.
28+ */
29+ if (rb->overwrite)
2430 return true;
2531
26− mask = perf_data_size(rb) - 1;
32+ /*
33+ * verify that payload is not bigger than buffer
34+ * otherwise masking logic may fail to detect
35+ * the "not enough space" condition
36+ */
37+ if ((head - offset) > sz)
38+ return false;
2739
2840 offset = (offset - tail) & mask;
2941 head = (head - tail) & mask;
@@ -212,7 +224,9 @@ ring_buffer_init(struct ring_buffer *rb, long watermark, int flags) · 182 unmodified lines
212224 rb->watermark = max_size / 2;
213225
214226 if (flags & RING_BUFFER_WRITABLE)
215− rb->writable = 1;
227+ rb->overwrite = 0;
228+ else
229+ rb->overwrite = 1;
216230
217231 atomic_set(&rb->refcount, 1);
218232
kernel/trace/ftrace.c+2−2
@@ -3440,14 +3440,14 @@ static char ftrace_filter_buf[FTRACE_FILTER_SIZE] __initdata; · 3439 unmodified lines
34403440
34413441 static int __init set_ftrace_notrace(char *str)
34423442 {
3443− strncpy(ftrace_notrace_buf, str, FTRACE_FILTER_SIZE);
3443+ strlcpy(ftrace_notrace_buf, str, FTRACE_FILTER_SIZE);
34443444 return 1;
34453445 }
34463446 __setup("ftrace_notrace=", set_ftrace_notrace);
34473447
34483448 static int __init set_ftrace_filter(char *str)
34493449 {
3450− strncpy(ftrace_filter_buf, str, FTRACE_FILTER_SIZE);
3450+ strlcpy(ftrace_filter_buf, str, FTRACE_FILTER_SIZE);
34513451 return 1;
34523452 }
34533453 __setup("ftrace_filter=", set_ftrace_filter);
kernel/trace/trace.c+2−2
@@ -132,7 +132,7 @@ static char *default_bootup_tracer; · 131 unmodified lines
132132
133133 static int __init set_cmdline_ftrace(char *str)
134134 {
135− strncpy(bootup_tracer_buf, str, MAX_TRACER_SIZE);
135+ strlcpy(bootup_tracer_buf, str, MAX_TRACER_SIZE);
136136 default_bootup_tracer = bootup_tracer_buf;
137137 /* We are using ftrace early, expand it */
138138 ring_buffer_expanded = 1;
@@ -162,7 +162,7 @@ static char *trace_boot_options __initdata; · 23 unmodified lines
162162
163163 static int __init set_trace_boot_options(char *str)
164164 {
165− strncpy(trace_boot_options_buf, str, MAX_TRACER_SIZE);
165+ strlcpy(trace_boot_options_buf, str, MAX_TRACER_SIZE);
166166 trace_boot_options = trace_boot_options_buf;
167167 return 0;
168168 }