tracing: Use trace_seq_used() and seq_buf_used() instead of len
As the seq_buf->len will soon be +1 size when there's an overflow, we must use trace_seq_used() or seq_buf_used() methods to get the real length. This will prevent buffer overflow issues if just the len of the seq_buf descriptor is used to copy memory. Link: http://lkml.kernel.org/r/20141114121911.09ba3d38@gandalf.local.home Reported-by: Petr Mladek <pmladek@suse.cz> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:

committed by
Steven Rostedt

parent
74f06bb723
commit
5ac4837841
@@ -23,6 +23,24 @@ trace_seq_init(struct trace_seq *s)
|
||||
s->full = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* trace_seq_used - amount of actual data written to buffer
|
||||
* @s: trace sequence descriptor
|
||||
*
|
||||
* Returns the amount of data written to the buffer.
|
||||
*
|
||||
* IMPORTANT!
|
||||
*
|
||||
* Use this instead of @s->seq.len if you need to pass the amount
|
||||
* of data from the buffer to another buffer (userspace, or what not).
|
||||
* The @s->seq.len on overflow is bigger than the buffer size and
|
||||
* using it can cause access to undefined memory.
|
||||
*/
|
||||
static inline int trace_seq_used(struct trace_seq *s)
|
||||
{
|
||||
return seq_buf_used(&s->seq);
|
||||
}
|
||||
|
||||
/**
|
||||
* trace_seq_buffer_ptr - return pointer to next location in buffer
|
||||
* @s: trace sequence descriptor
|
||||
@@ -35,7 +53,7 @@ trace_seq_init(struct trace_seq *s)
|
||||
static inline unsigned char *
|
||||
trace_seq_buffer_ptr(struct trace_seq *s)
|
||||
{
|
||||
return s->buffer + s->seq.len;
|
||||
return s->buffer + seq_buf_used(&s->seq);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user