smb3: warn on confusing error scenario with sec=krb5
[linux-2.6-microblaze.git] / kernel / sys.c
index 891667a..00a9674 100644 (file)
@@ -393,6 +393,10 @@ long __sys_setregid(gid_t rgid, gid_t egid)
                new->sgid = new->egid;
        new->fsgid = new->egid;
 
+       retval = security_task_fix_setgid(new, old, LSM_SETID_RE);
+       if (retval < 0)
+               goto error;
+
        return commit_creds(new);
 
 error:
@@ -435,6 +439,10 @@ long __sys_setgid(gid_t gid)
        else
                goto error;
 
+       retval = security_task_fix_setgid(new, old, LSM_SETID_ID);
+       if (retval < 0)
+               goto error;
+
        return commit_creds(new);
 
 error:
@@ -756,6 +764,10 @@ long __sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid)
                new->sgid = ksgid;
        new->fsgid = new->egid;
 
+       retval = security_task_fix_setgid(new, old, LSM_SETID_RES);
+       if (retval < 0)
+               goto error;
+
        return commit_creds(new);
 
 error:
@@ -862,7 +874,8 @@ long __sys_setfsgid(gid_t gid)
            ns_capable(old->user_ns, CAP_SETGID)) {
                if (!gid_eq(kgid, old->fsgid)) {
                        new->fsgid = kgid;
-                       goto change_okay;
+                       if (security_task_fix_setgid(new,old,LSM_SETID_FS) == 0)
+                               goto change_okay;
                }
        }
 
@@ -1846,7 +1859,7 @@ static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd)
        if (exe_file) {
                struct vm_area_struct *vma;
 
-               down_read(&mm->mmap_sem);
+               mmap_read_lock(mm);
                for (vma = mm->mmap; vma; vma = vma->vm_next) {
                        if (!vma->vm_file)
                                continue;
@@ -1855,7 +1868,7 @@ static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd)
                                goto exit_err;
                }
 
-               up_read(&mm->mmap_sem);
+               mmap_read_unlock(mm);
                fput(exe_file);
        }
 
@@ -1869,7 +1882,7 @@ exit:
        fdput(exe);
        return err;
 exit_err:
-       up_read(&mm->mmap_sem);
+       mmap_read_unlock(mm);
        fput(exe_file);
        goto exit;
 }
@@ -2007,10 +2020,10 @@ static int prctl_set_mm_map(int opt, const void __user *addr, unsigned long data
        }
 
        /*
-        * arg_lock protects concurent updates but we still need mmap_sem for
+        * arg_lock protects concurent updates but we still need mmap_lock for
         * read to exclude races with sys_brk.
         */
-       down_read(&mm->mmap_sem);
+       mmap_read_lock(mm);
 
        /*
         * We don't validate if these members are pointing to
@@ -2049,7 +2062,7 @@ static int prctl_set_mm_map(int opt, const void __user *addr, unsigned long data
        if (prctl_map.auxv_size)
                memcpy(mm->saved_auxv, user_auxv, sizeof(user_auxv));
 
-       up_read(&mm->mmap_sem);
+       mmap_read_unlock(mm);
        return 0;
 }
 #endif /* CONFIG_CHECKPOINT_RESTORE */
@@ -2122,10 +2135,10 @@ static int prctl_set_mm(int opt, unsigned long addr,
 
        /*
         * arg_lock protects concurent updates of arg boundaries, we need
-        * mmap_sem for a) concurrent sys_brk, b) finding VMA for addr
+        * mmap_lock for a) concurrent sys_brk, b) finding VMA for addr
         * validation.
         */
-       down_read(&mm->mmap_sem);
+       mmap_read_lock(mm);
        vma = find_vma(mm, addr);
 
        spin_lock(&mm->arg_lock);
@@ -2217,7 +2230,7 @@ static int prctl_set_mm(int opt, unsigned long addr,
        error = 0;
 out:
        spin_unlock(&mm->arg_lock);
-       up_read(&mm->mmap_sem);
+       mmap_read_unlock(mm);
        return error;
 }
 
@@ -2442,13 +2455,13 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
        case PR_SET_THP_DISABLE:
                if (arg3 || arg4 || arg5)
                        return -EINVAL;
-               if (down_write_killable(&me->mm->mmap_sem))
+               if (mmap_write_lock_killable(me->mm))
                        return -EINTR;
                if (arg2)
                        set_bit(MMF_DISABLE_THP, &me->mm->flags);
                else
                        clear_bit(MMF_DISABLE_THP, &me->mm->flags);
-               up_write(&me->mm->mmap_sem);
+               mmap_write_unlock(me->mm);
                break;
        case PR_MPX_ENABLE_MANAGEMENT:
        case PR_MPX_DISABLE_MANAGEMENT: