]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/binfmt_elf_fdpic.c
binfmt_elf_fdpic: wire up AT_EXECFD, AT_EXECFN, AT_SECURE
[linux-2.6-omap-h63xx.git] / fs / binfmt_elf_fdpic.c
index 9eee649449a8270c47dd9352a6609db670137664..0e8367c546248987418191c6ab7b14c5be61bec9 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/fcntl.h>
 #include <linux/slab.h>
 #include <linux/pagemap.h>
+#include <linux/security.h>
 #include <linux/highmem.h>
 #include <linux/highuid.h>
 #include <linux/personality.h>
@@ -560,11 +561,14 @@ static int create_elf_fdpic_tables(struct linux_binprm *bprm,
        }
 
        /* force 16 byte _final_ alignment here for generality */
-#define DLINFO_ITEMS 13
+#define DLINFO_ITEMS 15
 
        nitems = 1 + DLINFO_ITEMS + (k_platform ? 1 : 0) +
                (k_base_platform ? 1 : 0) + AT_VECTOR_SIZE_ARCH;
 
+       if (bprm->interp_flags & BINPRM_FLAGS_EXECFD)
+               nitems++;
+
        csp = sp;
        sp -= nitems * 2 * sizeof(unsigned long);
        sp -= (bprm->envc + 1) * sizeof(char *);        /* envv[] */
@@ -602,6 +606,12 @@ static int create_elf_fdpic_tables(struct linux_binprm *bprm,
                            (elf_addr_t) (unsigned long) u_base_platform);
        }
 
+       if (bprm->interp_flags & BINPRM_FLAGS_EXECFD) {
+               nr = 0;
+               csp -= 2 * sizeof(unsigned long);
+               NEW_AUX_ENT(AT_EXECFD, bprm->interp_data);
+       }
+
        nr = 0;
        csp -= DLINFO_ITEMS * 2 * sizeof(unsigned long);
        NEW_AUX_ENT(AT_HWCAP,   hwcap);
@@ -617,6 +627,8 @@ static int create_elf_fdpic_tables(struct linux_binprm *bprm,
        NEW_AUX_ENT(AT_EUID,    (elf_addr_t) current->euid);
        NEW_AUX_ENT(AT_GID,     (elf_addr_t) current->gid);
        NEW_AUX_ENT(AT_EGID,    (elf_addr_t) current->egid);
+       NEW_AUX_ENT(AT_SECURE,  security_bprm_secureexec(bprm));
+       NEW_AUX_ENT(AT_EXECFN,  bprm->exec);
 
 #ifdef ARCH_DLINFO
        nr = 0;