lkml.org 
[lkml]   [2012]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[v2.6.34-stable 008/165] regset: Prevent null pointer reference on readonly regsets
    Date
    From: "H. Peter Anvin" <hpa@zytor.com>

    -------------------
    This is a commit scheduled for the next v2.6.34 longterm release.
    http://git.kernel.org/?p=linux/kernel/git/paulg/longterm-queue-2.6.34.git
    If you see a problem with using this for longterm, please comment.
    -------------------

    commit c8e252586f8d5de906385d8cf6385fee289a825e upstream.

    The regset common infrastructure assumed that regsets would always
    have .get and .set methods, but not necessarily .active methods.
    Unfortunately people have since written regsets without .set methods.

    Rather than putting in stub functions everywhere, handle regsets with
    null .get or .set methods explicitly.

    Signed-off-by: H. Peter Anvin <hpa@zytor.com>
    Reviewed-by: Oleg Nesterov <oleg@redhat.com>
    Acked-by: Roland McGrath <roland@hack.frob.com>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
    ---
    fs/binfmt_elf.c | 2 +-
    include/linux/regset.h | 6 ++++++
    2 files changed, 7 insertions(+), 1 deletion(-)

    diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
    index 535e763..c21da8a 100644
    --- a/fs/binfmt_elf.c
    +++ b/fs/binfmt_elf.c
    @@ -1414,7 +1414,7 @@ static int fill_thread_core_info(struct elf_thread_core_info *t,
    for (i = 1; i < view->n; ++i) {
    const struct user_regset *regset = &view->regsets[i];
    do_thread_regset_writeback(t->task, regset);
    - if (regset->core_note_type &&
    + if (regset->core_note_type && regset->get &&
    (!regset->active || regset->active(t->task, regset))) {
    int ret;
    size_t size = regset->n * regset->size;
    diff --git a/include/linux/regset.h b/include/linux/regset.h
    index 8abee65..5150fd1 100644
    --- a/include/linux/regset.h
    +++ b/include/linux/regset.h
    @@ -335,6 +335,9 @@ static inline int copy_regset_to_user(struct task_struct *target,
    {
    const struct user_regset *regset = &view->regsets[setno];

    + if (!regset->get)
    + return -EOPNOTSUPP;
    +
    if (!access_ok(VERIFY_WRITE, data, size))
    return -EIO;

    @@ -358,6 +361,9 @@ static inline int copy_regset_from_user(struct task_struct *target,
    {
    const struct user_regset *regset = &view->regsets[setno];

    + if (!regset->set)
    + return -EOPNOTSUPP;
    +
    if (!access_ok(VERIFY_READ, data, size))
    return -EIO;

    --
    1.7.12.rc2


    \
     
     \ /
      Last update: 2012-08-15 23:23    [W:5.011 / U:0.304 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site