Re: [PATCH 1/1] function tracing: fix wrong position computing ofstack_trace

From: Wang Liming
Date: Fri Nov 21 2008 - 03:18:00 EST


Ingo Molnar wrote:
* Liming Wang <liming.wang@xxxxxxxxxxxxx> wrote:

Impact: make output of stack_trace complete if buffer overflow

When read buffer overflows, the output of stack_trace isn't complete.

When printing records with seq_printf in t_show, if the read buffer has overflowed by the current record, then this record won't be printed to user space through read buffer, it will just be dropped in this printing.

When next printing, t_start should return the "*pos"th record, which is the one dropped by previous printing, but it just returns (m->private + *pos)th record.

Here we use a more sane method to implement seq_operations which can be found in kernel code. Thus we needn't initialize m->private.

About testing, it's not easy to overflow read buffer, but we can use seq_printf to print more padding bytes in t_show, then it's easy to check whether or not records are lost.

This commit has been tested on both condition of overflow and non overflow.

Signed-off-by: Liming Wang <liming.wang@xxxxxxxxxxxxx>
---
kernel/trace/trace_stack.c | 24 +++++++++++++++---------
1 files changed, 15 insertions(+), 9 deletions(-)

applied to tip/tracing/urgent, thanks!

Note, i changed 'buffer overflow' to 'buffer overrun'. (buffer overflow is a term typically used in a security context)
OK.


- i++;
+ if (v == SEQ_START_TOKEN )
+ i = 0;
+ else {
+ i = *(long *)v;
+ i++;
+ }

i also fixed these two minor style problems pointed out by scripts/checkpatch.pl:

| ERROR: space prohibited before that close parenthesis ')'
| #47: FILE: kernel/trace/trace_stack.c:187:
| + if (v == SEQ_START_TOKEN )
|
| ERROR: space prohibited before that close parenthesis ')'
| #82: FILE: kernel/trace/trace_stack.c:245:
| + if (v == SEQ_START_TOKEN ) {
|
| total: 2 errors, 0 warnings, 0 checks, 64 lines checked
It's my fault, thanks a lot!

walimis

Ingo


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/