Revert "ARM: Revert "ARM: 6878/1: fix personality flag propagation across an exec""
Aly Hirani [Thu, 6 Dec 2012 05:00:23 +0000 (21:00 -0800)]
This reverts commit 25cd08cd1fb5888fe0d9bcc1e58b9d6b8378e1fd.
ADDR_COMPAT_LAYOUT is set on zygote to prevent Unity games from
crashing in K3.4. However, since the propagation of personality was
disabled, this flag never ended up being set on the fork()ed
processes.

Additionally, in order to prevent Bug 894472 to resurface with this
revert, mask out READ_IMPLIES_EXEC from being propagated to child
processes.

Bug 1023189

Change-Id: I01d5b7b3778b9e99815146bd2345bda1266e6309
Signed-off-by: Aly Hirani <ahirani@nvidia.com>
Reviewed-on: http://git-master/r/168956
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Peter De Schrijver <pdeschrijver@nvidia.com>
Reviewed-by: Varun Wadekar <vwadekar@nvidia.com>
Reviewed-by: Liang Cheng (SW) <licheng@nvidia.com>
Reviewed-by: Dan Willemsen <dwillemsen@nvidia.com>

arch/arm/kernel/elf.c

index 96b83d3..567ae1b 100644 (file)
@@ -41,15 +41,23 @@ EXPORT_SYMBOL(elf_check_arch);
 void elf_set_personality(const struct elf32_hdr *x)
 {
        unsigned int eflags = x->e_flags;
-       unsigned int personality = PER_LINUX_32BIT;
+       unsigned int personality = current->personality &
+               ~(PER_MASK | READ_IMPLIES_EXEC);
+
+       /*
+        * We only support Linux ELF executables, so always set the
+        * personality to LINUX.
+        */
+       personality |= PER_LINUX;
 
        /*
         * APCS-26 is only valid for OABI executables
         */
-       if ((eflags & EF_ARM_EABI_MASK) == EF_ARM_EABI_UNKNOWN) {
-               if (eflags & EF_ARM_APCS_26)
-                       personality = PER_LINUX;
-       }
+       if ((eflags & EF_ARM_EABI_MASK) == EF_ARM_EABI_UNKNOWN &&
+           (eflags & EF_ARM_APCS_26))
+               personality &= ~ADDR_LIMIT_32BIT;
+       else
+               personality |= ADDR_LIMIT_32BIT;
 
        set_personality(personality);