lkml.org 
[lkml]   [2010]   [May]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 09/11] rlimits: switch more rlimit syscalls to do_prlimit
    Date
    From: Jiri Slaby <jirislaby@gmail.com>

    After we added more generic do_prlimit, switch sys_getrlimit to that.
    Also switch compat handling, so we can get rid of ugly __user casts
    and avoid setting process' address limit to kernel data and back.

    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    kernel/compat.c | 16 +++-------------
    kernel/sys.c | 17 ++++++++---------
    2 files changed, 11 insertions(+), 22 deletions(-)

    diff --git a/kernel/compat.c b/kernel/compat.c
    index 7f40e92..199b345 100644
    --- a/kernel/compat.c
    +++ b/kernel/compat.c
    @@ -280,10 +280,6 @@ asmlinkage long compat_sys_setrlimit(unsigned int resource,
    {
    struct rlimit r;
    int ret;
    - mm_segment_t old_fs = get_fs ();
    -
    - if (resource >= RLIM_NLIMITS)
    - return -EINVAL;

    if (!access_ok(VERIFY_READ, rlim, sizeof(*rlim)) ||
    __get_user(r.rlim_cur, &rlim->rlim_cur) ||
    @@ -294,10 +290,7 @@ asmlinkage long compat_sys_setrlimit(unsigned int resource,
    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);
    - set_fs(old_fs);
    - return ret;
    + return do_prlimit(current, resource, &r, NULL);
    }

    #ifdef COMPAT_RLIM_OLD_INFINITY
    @@ -329,16 +322,13 @@ asmlinkage long compat_sys_old_getrlimit(unsigned int resource,

    #endif

    -asmlinkage long compat_sys_getrlimit (unsigned int resource,
    +asmlinkage long compat_sys_getrlimit(unsigned int resource,
    struct compat_rlimit __user *rlim)
    {
    struct rlimit r;
    int ret;
    - mm_segment_t old_fs = get_fs();

    - set_fs(KERNEL_DS);
    - ret = sys_getrlimit(resource, (struct rlimit __user *) &r);
    - set_fs(old_fs);
    + ret = do_prlimit(current, resource, NULL, &r);
    if (!ret) {
    if (r.rlim_cur > COMPAT_RLIM_INFINITY)
    r.rlim_cur = COMPAT_RLIM_INFINITY;
    diff --git a/kernel/sys.c b/kernel/sys.c
    index 7a453d2..0f8034f 100644
    --- a/kernel/sys.c
    +++ b/kernel/sys.c
    @@ -1236,15 +1236,14 @@ SYSCALL_DEFINE2(setdomainname, char __user *, name, int, len)

    SYSCALL_DEFINE2(getrlimit, unsigned int, resource, struct rlimit __user *, rlim)
    {
    - if (resource >= RLIM_NLIMITS)
    - return -EINVAL;
    - else {
    - struct rlimit value;
    - task_lock(current->group_leader);
    - value = current->signal->rlim[resource];
    - task_unlock(current->group_leader);
    - return copy_to_user(rlim, &value, sizeof(*rlim)) ? -EFAULT : 0;
    - }
    + struct rlimit value;
    + int ret;
    +
    + ret = do_prlimit(current, resource, NULL, &value);
    + if (!ret)
    + ret = copy_to_user(rlim, &value, sizeof(*rlim)) ? -EFAULT : 0;
    +
    + return ret;
    }

    #ifdef __ARCH_WANT_SYS_OLD_GETRLIMIT
    --
    1.7.1



    \
     
     \ /
      Last update: 2010-05-07 11:01    [W:0.030 / U:1.480 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site