diff options
Diffstat (limited to 'fs/binfmt_aout.c')
-rw-r--r-- | fs/binfmt_aout.c | 81 |
1 files changed, 8 insertions, 73 deletions
diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c index f1f3f4192a60..b639dcf7c778 100644 --- a/fs/binfmt_aout.c +++ b/fs/binfmt_aout.c | |||
@@ -95,92 +95,55 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file, u | |||
95 | int has_dumped = 0; | 95 | int has_dumped = 0; |
96 | unsigned long dump_start, dump_size; | 96 | unsigned long dump_start, dump_size; |
97 | struct user dump; | 97 | struct user dump; |
98 | #if defined(__alpha__) | 98 | #ifdef __alpha__ |
99 | # define START_DATA(u) (u.start_data) | 99 | # define START_DATA(u) (u.start_data) |
100 | #elif defined(__arm__) | 100 | #else |
101 | # define START_DATA(u) ((u.u_tsize << PAGE_SHIFT) + u.start_code) | 101 | # define START_DATA(u) ((u.u_tsize << PAGE_SHIFT) + u.start_code) |
102 | #elif defined(__sparc__) | ||
103 | # define START_DATA(u) (u.u_tsize) | ||
104 | #elif defined(__i386__) || defined(__mc68000__) || defined(__arch_um__) | ||
105 | # define START_DATA(u) (u.u_tsize << PAGE_SHIFT) | ||
106 | #endif | 102 | #endif |
107 | #ifdef __sparc__ | ||
108 | # define START_STACK(u) ((regs->u_regs[UREG_FP]) & ~(PAGE_SIZE - 1)) | ||
109 | #else | ||
110 | # define START_STACK(u) (u.start_stack) | 103 | # define START_STACK(u) (u.start_stack) |
111 | #endif | ||
112 | 104 | ||
113 | fs = get_fs(); | 105 | fs = get_fs(); |
114 | set_fs(KERNEL_DS); | 106 | set_fs(KERNEL_DS); |
115 | has_dumped = 1; | 107 | has_dumped = 1; |
116 | current->flags |= PF_DUMPCORE; | 108 | current->flags |= PF_DUMPCORE; |
117 | strncpy(dump.u_comm, current->comm, sizeof(dump.u_comm)); | 109 | strncpy(dump.u_comm, current->comm, sizeof(dump.u_comm)); |
118 | #ifndef __sparc__ | ||
119 | dump.u_ar0 = offsetof(struct user, regs); | 110 | dump.u_ar0 = offsetof(struct user, regs); |
120 | #endif | ||
121 | dump.signal = signr; | 111 | dump.signal = signr; |
122 | aout_dump_thread(regs, &dump); | 112 | aout_dump_thread(regs, &dump); |
123 | 113 | ||
124 | /* If the size of the dump file exceeds the rlimit, then see what would happen | 114 | /* If the size of the dump file exceeds the rlimit, then see what would happen |
125 | if we wrote the stack, but not the data area. */ | 115 | if we wrote the stack, but not the data area. */ |
126 | #ifdef __sparc__ | ||
127 | if ((dump.u_dsize + dump.u_ssize) > limit) | ||
128 | dump.u_dsize = 0; | ||
129 | #else | ||
130 | if ((dump.u_dsize + dump.u_ssize+1) * PAGE_SIZE > limit) | 116 | if ((dump.u_dsize + dump.u_ssize+1) * PAGE_SIZE > limit) |
131 | dump.u_dsize = 0; | 117 | dump.u_dsize = 0; |
132 | #endif | ||
133 | 118 | ||
134 | /* Make sure we have enough room to write the stack and data areas. */ | 119 | /* Make sure we have enough room to write the stack and data areas. */ |
135 | #ifdef __sparc__ | ||
136 | if (dump.u_ssize > limit) | ||
137 | dump.u_ssize = 0; | ||
138 | #else | ||
139 | if ((dump.u_ssize + 1) * PAGE_SIZE > limit) | 120 | if ((dump.u_ssize + 1) * PAGE_SIZE > limit) |
140 | dump.u_ssize = 0; | 121 | dump.u_ssize = 0; |
141 | #endif | ||
142 | 122 | ||
143 | /* make sure we actually have a data and stack area to dump */ | 123 | /* make sure we actually have a data and stack area to dump */ |
144 | set_fs(USER_DS); | 124 | set_fs(USER_DS); |
145 | #ifdef __sparc__ | ||
146 | if (!access_ok(VERIFY_READ, (void __user *)START_DATA(dump), dump.u_dsize)) | ||
147 | dump.u_dsize = 0; | ||
148 | if (!access_ok(VERIFY_READ, (void __user *)START_STACK(dump), dump.u_ssize)) | ||
149 | dump.u_ssize = 0; | ||
150 | #else | ||
151 | if (!access_ok(VERIFY_READ, (void __user *)START_DATA(dump), dump.u_dsize << PAGE_SHIFT)) | 125 | if (!access_ok(VERIFY_READ, (void __user *)START_DATA(dump), dump.u_dsize << PAGE_SHIFT)) |
152 | dump.u_dsize = 0; | 126 | dump.u_dsize = 0; |
153 | if (!access_ok(VERIFY_READ, (void __user *)START_STACK(dump), dump.u_ssize << PAGE_SHIFT)) | 127 | if (!access_ok(VERIFY_READ, (void __user *)START_STACK(dump), dump.u_ssize << PAGE_SHIFT)) |
154 | dump.u_ssize = 0; | 128 | dump.u_ssize = 0; |
155 | #endif | ||
156 | 129 | ||
157 | set_fs(KERNEL_DS); | 130 | set_fs(KERNEL_DS); |
158 | /* struct user */ | 131 | /* struct user */ |
159 | DUMP_WRITE(&dump,sizeof(dump)); | 132 | DUMP_WRITE(&dump,sizeof(dump)); |
160 | /* Now dump all of the user data. Include malloced stuff as well */ | 133 | /* Now dump all of the user data. Include malloced stuff as well */ |
161 | #ifndef __sparc__ | ||
162 | DUMP_SEEK(PAGE_SIZE); | 134 | DUMP_SEEK(PAGE_SIZE); |
163 | #endif | ||
164 | /* now we start writing out the user space info */ | 135 | /* now we start writing out the user space info */ |
165 | set_fs(USER_DS); | 136 | set_fs(USER_DS); |
166 | /* Dump the data area */ | 137 | /* Dump the data area */ |
167 | if (dump.u_dsize != 0) { | 138 | if (dump.u_dsize != 0) { |
168 | dump_start = START_DATA(dump); | 139 | dump_start = START_DATA(dump); |
169 | #ifdef __sparc__ | ||
170 | dump_size = dump.u_dsize; | ||
171 | #else | ||
172 | dump_size = dump.u_dsize << PAGE_SHIFT; | 140 | dump_size = dump.u_dsize << PAGE_SHIFT; |
173 | #endif | ||
174 | DUMP_WRITE(dump_start,dump_size); | 141 | DUMP_WRITE(dump_start,dump_size); |
175 | } | 142 | } |
176 | /* Now prepare to dump the stack area */ | 143 | /* Now prepare to dump the stack area */ |
177 | if (dump.u_ssize != 0) { | 144 | if (dump.u_ssize != 0) { |
178 | dump_start = START_STACK(dump); | 145 | dump_start = START_STACK(dump); |
179 | #ifdef __sparc__ | ||
180 | dump_size = dump.u_ssize; | ||
181 | #else | ||
182 | dump_size = dump.u_ssize << PAGE_SHIFT; | 146 | dump_size = dump.u_ssize << PAGE_SHIFT; |
183 | #endif | ||
184 | DUMP_WRITE(dump_start,dump_size); | 147 | DUMP_WRITE(dump_start,dump_size); |
185 | } | 148 | } |
186 | /* Finally dump the task struct. Not be used by gdb, but could be useful */ | 149 | /* Finally dump the task struct. Not be used by gdb, but could be useful */ |
@@ -205,29 +168,24 @@ static unsigned long __user *create_aout_tables(char __user *p, struct linux_bin | |||
205 | int envc = bprm->envc; | 168 | int envc = bprm->envc; |
206 | 169 | ||
207 | sp = (void __user *)((-(unsigned long)sizeof(char *)) & (unsigned long) p); | 170 | sp = (void __user *)((-(unsigned long)sizeof(char *)) & (unsigned long) p); |
208 | #ifdef __sparc__ | ||
209 | /* This imposes the proper stack alignment for a new process. */ | ||
210 | sp = (void __user *) (((unsigned long) sp) & ~7); | ||
211 | if ((envc+argc+3)&1) --sp; | ||
212 | #endif | ||
213 | #ifdef __alpha__ | 171 | #ifdef __alpha__ |
214 | /* whee.. test-programs are so much fun. */ | 172 | /* whee.. test-programs are so much fun. */ |
215 | put_user(0, --sp); | 173 | put_user(0, --sp); |
216 | put_user(0, --sp); | 174 | put_user(0, --sp); |
217 | if (bprm->loader) { | 175 | if (bprm->loader) { |
218 | put_user(0, --sp); | 176 | put_user(0, --sp); |
219 | put_user(0x3eb, --sp); | 177 | put_user(1003, --sp); |
220 | put_user(bprm->loader, --sp); | 178 | put_user(bprm->loader, --sp); |
221 | put_user(0x3ea, --sp); | 179 | put_user(1002, --sp); |
222 | } | 180 | } |
223 | put_user(bprm->exec, --sp); | 181 | put_user(bprm->exec, --sp); |
224 | put_user(0x3e9, --sp); | 182 | put_user(1001, --sp); |
225 | #endif | 183 | #endif |
226 | sp -= envc+1; | 184 | sp -= envc+1; |
227 | envp = (char __user * __user *) sp; | 185 | envp = (char __user * __user *) sp; |
228 | sp -= argc+1; | 186 | sp -= argc+1; |
229 | argv = (char __user * __user *) sp; | 187 | argv = (char __user * __user *) sp; |
230 | #if defined(__i386__) || defined(__mc68000__) || defined(__arm__) || defined(__arch_um__) | 188 | #ifndef __alpha__ |
231 | put_user((unsigned long) envp,--sp); | 189 | put_user((unsigned long) envp,--sp); |
232 | put_user((unsigned long) argv,--sp); | 190 | put_user((unsigned long) argv,--sp); |
233 | #endif | 191 | #endif |
@@ -300,13 +258,8 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
300 | return retval; | 258 | return retval; |
301 | 259 | ||
302 | /* OK, This is the point of no return */ | 260 | /* OK, This is the point of no return */ |
303 | #if defined(__alpha__) | 261 | #ifdef __alpha__ |
304 | SET_AOUT_PERSONALITY(bprm, ex); | 262 | SET_AOUT_PERSONALITY(bprm, ex); |
305 | #elif defined(__sparc__) | ||
306 | set_personality(PER_SUNOS); | ||
307 | #if !defined(__sparc_v9__) | ||
308 | memcpy(¤t->thread.core_exec, &ex, sizeof(struct exec)); | ||
309 | #endif | ||
310 | #else | 263 | #else |
311 | set_personality(PER_LINUX); | 264 | set_personality(PER_LINUX); |
312 | #endif | 265 | #endif |
@@ -322,24 +275,6 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
322 | 275 | ||
323 | install_exec_creds(bprm); | 276 | install_exec_creds(bprm); |
324 | current->flags &= ~PF_FORKNOEXEC; | 277 | current->flags &= ~PF_FORKNOEXEC; |
325 | #ifdef __sparc__ | ||
326 | if (N_MAGIC(ex) == NMAGIC) { | ||
327 | loff_t pos = fd_offset; | ||
328 | /* Fuck me plenty... */ | ||
329 | /* <AOL></AOL> */ | ||
330 | down_write(¤t->mm->mmap_sem); | ||
331 | error = do_brk(N_TXTADDR(ex), ex.a_text); | ||
332 | up_write(¤t->mm->mmap_sem); | ||
333 | bprm->file->f_op->read(bprm->file, (char *) N_TXTADDR(ex), | ||
334 | ex.a_text, &pos); | ||
335 | down_write(¤t->mm->mmap_sem); | ||
336 | error = do_brk(N_DATADDR(ex), ex.a_data); | ||
337 | up_write(¤t->mm->mmap_sem); | ||
338 | bprm->file->f_op->read(bprm->file, (char *) N_DATADDR(ex), | ||
339 | ex.a_data, &pos); | ||
340 | goto beyond_if; | ||
341 | } | ||
342 | #endif | ||
343 | 278 | ||
344 | if (N_MAGIC(ex) == OMAGIC) { | 279 | if (N_MAGIC(ex) == OMAGIC) { |
345 | unsigned long text_addr, map_size; | 280 | unsigned long text_addr, map_size; |
@@ -347,7 +282,7 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
347 | 282 | ||
348 | text_addr = N_TXTADDR(ex); | 283 | text_addr = N_TXTADDR(ex); |
349 | 284 | ||
350 | #if defined(__alpha__) || defined(__sparc__) | 285 | #ifdef __alpha__ |
351 | pos = fd_offset; | 286 | pos = fd_offset; |
352 | map_size = ex.a_text+ex.a_data + PAGE_SIZE - 1; | 287 | map_size = ex.a_text+ex.a_data + PAGE_SIZE - 1; |
353 | #else | 288 | #else |