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)) |
