diff options
Diffstat (limited to 'fs/binfmt_flat.c')
-rw-r--r-- | fs/binfmt_flat.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index 49566c1687d8..b6ab27ccf214 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c | |||
@@ -56,15 +56,22 @@ | |||
56 | #endif | 56 | #endif |
57 | 57 | ||
58 | /* | 58 | /* |
59 | * User data (stack, data section and bss) needs to be aligned | 59 | * User data (data section and bss) needs to be aligned. |
60 | * for the same reasons as SLAB memory is, and to the same amount. | 60 | * We pick 0x20 here because it is the max value elf2flt has always |
61 | * Avoid duplicating architecture specific code by using the same | 61 | * used in producing FLAT files, and because it seems to be large |
62 | * macro as with SLAB allocation: | 62 | * enough to make all the gcc alignment related tests happy. |
63 | */ | ||
64 | #define FLAT_DATA_ALIGN (0x20) | ||
65 | |||
66 | /* | ||
67 | * User data (stack) also needs to be aligned. | ||
68 | * Here we can be a bit looser than the data sections since this | ||
69 | * needs to only meet arch ABI requirements. | ||
63 | */ | 70 | */ |
64 | #ifdef ARCH_SLAB_MINALIGN | 71 | #ifdef ARCH_SLAB_MINALIGN |
65 | #define FLAT_DATA_ALIGN (ARCH_SLAB_MINALIGN) | 72 | #define FLAT_STACK_ALIGN (ARCH_SLAB_MINALIGN) |
66 | #else | 73 | #else |
67 | #define FLAT_DATA_ALIGN (sizeof(void *)) | 74 | #define FLAT_STACK_ALIGN (sizeof(void *)) |
68 | #endif | 75 | #endif |
69 | 76 | ||
70 | #define RELOC_FAILED 0xff00ff01 /* Relocation incorrect somewhere */ | 77 | #define RELOC_FAILED 0xff00ff01 /* Relocation incorrect somewhere */ |
@@ -129,7 +136,7 @@ static unsigned long create_flat_tables( | |||
129 | 136 | ||
130 | sp = (unsigned long *)p; | 137 | sp = (unsigned long *)p; |
131 | sp -= (envc + argc + 2) + 1 + (flat_argvp_envp_on_stack() ? 2 : 0); | 138 | sp -= (envc + argc + 2) + 1 + (flat_argvp_envp_on_stack() ? 2 : 0); |
132 | sp = (unsigned long *) ((unsigned long)sp & -FLAT_DATA_ALIGN); | 139 | sp = (unsigned long *) ((unsigned long)sp & -FLAT_STACK_ALIGN); |
133 | argv = sp + 1 + (flat_argvp_envp_on_stack() ? 2 : 0); | 140 | argv = sp + 1 + (flat_argvp_envp_on_stack() ? 2 : 0); |
134 | envp = argv + (argc + 1); | 141 | envp = argv + (argc + 1); |
135 | 142 | ||
@@ -589,7 +596,7 @@ static int load_flat_file(struct linux_binprm * bprm, | |||
589 | if (IS_ERR_VALUE(result)) { | 596 | if (IS_ERR_VALUE(result)) { |
590 | printk("Unable to read data+bss, errno %d\n", (int)-result); | 597 | printk("Unable to read data+bss, errno %d\n", (int)-result); |
591 | do_munmap(current->mm, textpos, text_len); | 598 | do_munmap(current->mm, textpos, text_len); |
592 | do_munmap(current->mm, realdatastart, data_len + extra); | 599 | do_munmap(current->mm, realdatastart, len); |
593 | ret = result; | 600 | ret = result; |
594 | goto err; | 601 | goto err; |
595 | } | 602 | } |
@@ -876,7 +883,7 @@ static int load_flat_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
876 | stack_len = TOP_OF_ARGS - bprm->p; /* the strings */ | 883 | stack_len = TOP_OF_ARGS - bprm->p; /* the strings */ |
877 | stack_len += (bprm->argc + 1) * sizeof(char *); /* the argv array */ | 884 | stack_len += (bprm->argc + 1) * sizeof(char *); /* the argv array */ |
878 | stack_len += (bprm->envc + 1) * sizeof(char *); /* the envp array */ | 885 | stack_len += (bprm->envc + 1) * sizeof(char *); /* the envp array */ |
879 | stack_len += FLAT_DATA_ALIGN - 1; /* reserve for upcoming alignment */ | 886 | stack_len += FLAT_STACK_ALIGN - 1; /* reserve for upcoming alignment */ |
880 | 887 | ||
881 | res = load_flat_file(bprm, &libinfo, 0, &stack_len); | 888 | res = load_flat_file(bprm, &libinfo, 0, &stack_len); |
882 | if (IS_ERR_VALUE(res)) | 889 | if (IS_ERR_VALUE(res)) |