diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2008-04-16 14:55:26 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2008-05-12 11:46:51 -0400 |
commit | f4324f3eeb311d1889b8c25076f2669012323842 (patch) | |
tree | 4db25b6221447a64673e35fee2c97d31902f3118 /arch/mips/kernel/irixelf.c | |
parent | 1928cc84a0a937ce7042d9235996ab380f36f18a (diff) |
[MIPS] IRIX: Handle do_brk() error return correctly.
do_brk's return value was stored in an unsigned long variable before being
tested for less than zero making the test always fail. Also do_brk's
called irix_map_prda_page wasn't forwarding do_brk() success.
Bug checking the return value of do_brk() and initial fix for it found
by Roel Kluin <12o3l@tiscali.nl>.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/kernel/irixelf.c')
-rw-r--r-- | arch/mips/kernel/irixelf.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/mips/kernel/irixelf.c b/arch/mips/kernel/irixelf.c index 290d8e3a664d..469c7237e5ba 100644 --- a/arch/mips/kernel/irixelf.c +++ b/arch/mips/kernel/irixelf.c | |||
@@ -578,7 +578,7 @@ static inline int map_interpreter(struct elf_phdr *epp, struct elfhdr *ihp, | |||
578 | * process and the system, here we map the page and fill the | 578 | * process and the system, here we map the page and fill the |
579 | * structure | 579 | * structure |
580 | */ | 580 | */ |
581 | static void irix_map_prda_page(void) | 581 | static int irix_map_prda_page(void) |
582 | { | 582 | { |
583 | unsigned long v; | 583 | unsigned long v; |
584 | struct prda *pp; | 584 | struct prda *pp; |
@@ -587,8 +587,8 @@ static void irix_map_prda_page(void) | |||
587 | v = do_brk(PRDA_ADDRESS, PAGE_SIZE); | 587 | v = do_brk(PRDA_ADDRESS, PAGE_SIZE); |
588 | up_write(¤t->mm->mmap_sem); | 588 | up_write(¤t->mm->mmap_sem); |
589 | 589 | ||
590 | if (v < 0) | 590 | if (v != PRDA_ADDRESS) |
591 | return; | 591 | return v; /* v must be an error code */ |
592 | 592 | ||
593 | pp = (struct prda *) v; | 593 | pp = (struct prda *) v; |
594 | pp->prda_sys.t_pid = task_pid_vnr(current); | 594 | pp->prda_sys.t_pid = task_pid_vnr(current); |
@@ -596,6 +596,8 @@ static void irix_map_prda_page(void) | |||
596 | pp->prda_sys.t_rpid = task_pid_vnr(current); | 596 | pp->prda_sys.t_rpid = task_pid_vnr(current); |
597 | 597 | ||
598 | /* We leave the rest set to zero */ | 598 | /* We leave the rest set to zero */ |
599 | |||
600 | return 0; | ||
599 | } | 601 | } |
600 | 602 | ||
601 | 603 | ||
@@ -781,7 +783,8 @@ static int load_irix_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
781 | * IRIX maps a page at 0x200000 which holds some system | 783 | * IRIX maps a page at 0x200000 which holds some system |
782 | * information. Programs depend on this. | 784 | * information. Programs depend on this. |
783 | */ | 785 | */ |
784 | irix_map_prda_page(); | 786 | if (irix_map_prda_page()) |
787 | goto out_free_dentry; | ||
785 | 788 | ||
786 | padzero(elf_bss); | 789 | padzero(elf_bss); |
787 | 790 | ||