lkml.org 
[lkml]   [2009]   [Nov]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 26/27] COMPAT: add get/put_compat_rlimit
    Date
    Extract those functions from compat_sys_[gs]etrlimit for later
    use with newly added rlimit syscalls.

    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    Cc: James Morris <jmorris@namei.org>
    Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Ingo Molnar <mingo@elte.hu>
    ---
    kernel/compat.c | 61 ++++++++++++++++++++++++++++++++++++-------------------
    1 files changed, 40 insertions(+), 21 deletions(-)

    diff --git a/kernel/compat.c b/kernel/compat.c
    index f6c204f..af15719 100644
    --- a/kernel/compat.c
    +++ b/kernel/compat.c
    @@ -274,6 +274,39 @@ asmlinkage long compat_sys_sigprocmask(int how, compat_old_sigset_t __user *set,
    return ret;
    }

    +static int get_compat_rlimit(struct rlimit *dst,
    + const struct compat_rlimit __user *src)
    +{
    + if (!access_ok(VERIFY_READ, src, sizeof(*src)) ||
    + __get_user(dst->rlim_cur, &src->rlim_cur) ||
    + __get_user(dst->rlim_max, &src->rlim_max))
    + return -EFAULT;
    +
    + if (dst->rlim_cur == COMPAT_RLIM_INFINITY)
    + dst->rlim_cur = RLIM_INFINITY;
    + if (dst->rlim_max == COMPAT_RLIM_INFINITY)
    + dst->rlim_max = RLIM_INFINITY;
    + return 0;
    +}
    +
    +static int put_compat_rlimit(const struct rlimit *src,
    + struct compat_rlimit __user *dst)
    +{
    + struct rlimit r = *src;
    +
    + if (r.rlim_cur > COMPAT_RLIM_INFINITY)
    + r.rlim_cur = COMPAT_RLIM_INFINITY;
    + if (r.rlim_max > COMPAT_RLIM_INFINITY)
    + r.rlim_max = COMPAT_RLIM_INFINITY;
    +
    + if (!access_ok(VERIFY_WRITE, dst, sizeof(*dst)) ||
    + __put_user(r.rlim_cur, &dst->rlim_cur) ||
    + __put_user(r.rlim_max, &dst->rlim_max))
    + return -EFAULT;
    +
    + return 0;
    +}
    +
    asmlinkage long compat_sys_setrlimit(unsigned int resource,
    struct compat_rlimit __user *rlim)
    {
    @@ -284,17 +317,12 @@ asmlinkage long compat_sys_setrlimit(unsigned int resource,
    if (resource >= RLIM_NLIMITS)
    return -EINVAL;

    - if (!access_ok(VERIFY_READ, rlim, sizeof(*rlim)) ||
    - __get_user(r.rlim_cur, &rlim->rlim_cur) ||
    - __get_user(r.rlim_max, &rlim->rlim_max))
    - return -EFAULT;
    + ret = get_compat_rlimit(&r, rlim);
    + if (ret)
    + return ret;

    - if (r.rlim_cur == COMPAT_RLIM_INFINITY)
    - r.rlim_cur = RLIM_INFINITY;
    - if (r.rlim_max == COMPAT_RLIM_INFINITY)
    - r.rlim_max = RLIM_INFINITY;
    set_fs(KERNEL_DS);
    - ret = sys_setrlimit(resource, (struct rlimit __user *) &r);
    + ret = sys_setrlimit(resource, (struct rlimit __force __user *)&r);
    set_fs(old_fs);
    return ret;
    }
    @@ -336,19 +364,10 @@ asmlinkage long compat_sys_getrlimit (unsigned int resource,
    mm_segment_t old_fs = get_fs();

    set_fs(KERNEL_DS);
    - ret = sys_getrlimit(resource, (struct rlimit __user *) &r);
    + ret = sys_getrlimit(resource, (struct rlimit __force __user *)&r);
    set_fs(old_fs);
    - if (!ret) {
    - if (r.rlim_cur > COMPAT_RLIM_INFINITY)
    - r.rlim_cur = COMPAT_RLIM_INFINITY;
    - if (r.rlim_max > COMPAT_RLIM_INFINITY)
    - r.rlim_max = COMPAT_RLIM_INFINITY;
    -
    - if (!access_ok(VERIFY_WRITE, rlim, sizeof(*rlim)) ||
    - __put_user(r.rlim_cur, &rlim->rlim_cur) ||
    - __put_user(r.rlim_max, &rlim->rlim_max))
    - return -EFAULT;
    - }
    + if (!ret)
    + ret = put_compat_rlimit(&r, rlim);
    return ret;
    }

    --
    1.6.5.3


    \
     
     \ /
      Last update: 2009-11-28 00:13    [W:0.024 / U:149.700 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site