Merge branch 'linux-linaro-lsk-v3.10' into linux-linaro-lsk-v3.10-android
authorKevin Hilman <khilman@linaro.org>
Fri, 14 Aug 2015 16:45:22 +0000 (09:45 -0700)
committerKevin Hilman <khilman@linaro.org>
Fri, 14 Aug 2015 16:55:00 +0000 (09:55 -0700)
 Conflicts:
fs/exec.c

 Resolution summary:

    Conflict between upstream/LTS commit 9eae8ac6ab40 (fs: take
    i_mutex during prepare_binprm for set[ug]id executables) and
    android commit 9d0ff694bc22 (sched: move no_new_privs into new
    atomic flags).  Resolution: move task_no_new_privs() usage into
    new function created by upstream/LTS comit.

18 files changed:
1  2 
arch/arm64/mm/init.c
block/genhd.c
drivers/base/firmware_class.c
drivers/cpuidle/governors/menu.c
drivers/mmc/card/block.c
fs/btrfs/super.c
fs/exec.c
fs/ext4/mballoc.c
fs/ext4/super.c
fs/fuse/inode.c
fs/hpfs/super.c
include/linux/fs.h
include/linux/sched.h
kernel/trace/trace.h
net/ipv4/route.c
net/ipv4/udp.c
net/ipv6/route.c
net/ipv6/udp.c

Simple merge
diff --cc block/genhd.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc fs/exec.c
index cb7f31c71c6ba60e3e38118494c536751b0a2a7d,acbd7ac2deda4cbed77aecf25c22d2469f7d7234..54965313c23180bf4c0d9470ec5d9cb8497cc971
+++ b/fs/exec.c
@@@ -1265,6 -1265,53 +1265,53 @@@ static int check_unsafe_exec(struct lin
        return res;
  }
  
 -      if (current->no_new_privs)
+ static void bprm_fill_uid(struct linux_binprm *bprm)
+ {
+       struct inode *inode;
+       unsigned int mode;
+       kuid_t uid;
+       kgid_t gid;
+       /* clear any previous set[ug]id data from a previous binary */
+       bprm->cred->euid = current_euid();
+       bprm->cred->egid = current_egid();
+       if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID)
+               return;
++      if (task_no_new_privs(current))
+               return;
+       inode = file_inode(bprm->file);
+       mode = ACCESS_ONCE(inode->i_mode);
+       if (!(mode & (S_ISUID|S_ISGID)))
+               return;
+       /* Be careful if suid/sgid is set */
+       mutex_lock(&inode->i_mutex);
+       /* reload atomically mode/uid/gid now that lock held */
+       mode = inode->i_mode;
+       uid = inode->i_uid;
+       gid = inode->i_gid;
+       mutex_unlock(&inode->i_mutex);
+       /* We ignore suid/sgid if there are no mappings for them in the ns */
+       if (!kuid_has_mapping(bprm->cred->user_ns, uid) ||
+                !kgid_has_mapping(bprm->cred->user_ns, gid))
+               return;
+       if (mode & S_ISUID) {
+               bprm->per_clear |= PER_CLEAR_ON_SETID;
+               bprm->cred->euid = uid;
+       }
+       if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
+               bprm->per_clear |= PER_CLEAR_ON_SETID;
+               bprm->cred->egid = gid;
+       }
+ }
  /* 
   * Fill the binprm structure from the inode. 
   * Check permissions, then read the first 128 (BINPRM_BUF_SIZE) bytes
Simple merge
diff --cc fs/ext4/super.c
Simple merge
diff --cc fs/fuse/inode.c
Simple merge
diff --cc fs/hpfs/super.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc net/ipv4/udp.c
Simple merge
Simple merge
diff --cc net/ipv6/udp.c
Simple merge