lkml.org 
[lkml]   [2009]   [Mar]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 2/7] tracing: do not return EFAULT if read copied anything
    From: Steven Rostedt <srostedt@redhat.com>

    Impact: fix trace read to conform to standards

    Andrew Morton, Theodore Tso and H. Peter Anvin brought to my attention
    that a userspace read should not return -EFAULT if it succeeded in
    copying anything. It should only return -EFAULT if it failed to copy
    at all.

    This patch modifies the check of copy_from_user and updates the return
    code appropriately.

    I also used H. Peter Anvin's short cut rule to just test ret == count.

    Signed-off-by: Steven Rostedt <srostedt@redhat.com>
    ---
    kernel/trace/trace.c | 14 ++++++++++++--
    1 files changed, 12 insertions(+), 2 deletions(-)

    diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
    index ab5cbca..57155dc 100644
    --- a/kernel/trace/trace.c
    +++ b/kernel/trace/trace.c
    @@ -346,6 +346,9 @@ ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, size_t cnt)
    int len;
    int ret;

    + if (!cnt)
    + return 0;
    +
    if (s->len <= s->readpos)
    return -EBUSY;

    @@ -353,9 +356,11 @@ ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, size_t cnt)
    if (cnt > len)
    cnt = len;
    ret = copy_to_user(ubuf, s->buffer + s->readpos, cnt);
    - if (ret)
    + if (ret == cnt)
    return -EFAULT;

    + cnt -= ret;
    +
    s->readpos += len;
    return cnt;
    }
    @@ -3049,6 +3054,9 @@ tracing_buffers_read(struct file *filp, char __user *ubuf,
    ssize_t ret;
    size_t size;

    + if (!count)
    + return 0;
    +
    /* Do we have previous read data to read? */
    if (info->read < PAGE_SIZE)
    goto read;
    @@ -3073,8 +3081,10 @@ read:
    size = count;

    ret = copy_to_user(ubuf, info->spare + info->read, size);
    - if (ret)
    + if (ret == size)
    return -EFAULT;
    + size -= ret;
    +
    *ppos += size;
    info->read += size;

    --
    1.6.1.3
    --


    \
     
     \ /
      Last update: 2009-03-05 04:31    [W:0.021 / U:1.988 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site