diff options
Diffstat (limited to 'fs/binfmt_elf_fdpic.c')
-rw-r--r-- | fs/binfmt_elf_fdpic.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c index f3e72c5c19f5..fdb66faa24f1 100644 --- a/fs/binfmt_elf_fdpic.c +++ b/fs/binfmt_elf_fdpic.c | |||
@@ -972,9 +972,12 @@ static int elf_fdpic_map_file_constdisp_on_uclinux( | |||
972 | params->elfhdr_addr = seg->addr; | 972 | params->elfhdr_addr = seg->addr; |
973 | 973 | ||
974 | /* clear any space allocated but not loaded */ | 974 | /* clear any space allocated but not loaded */ |
975 | if (phdr->p_filesz < phdr->p_memsz) | 975 | if (phdr->p_filesz < phdr->p_memsz) { |
976 | clear_user((void *) (seg->addr + phdr->p_filesz), | 976 | ret = clear_user((void *) (seg->addr + phdr->p_filesz), |
977 | phdr->p_memsz - phdr->p_filesz); | 977 | phdr->p_memsz - phdr->p_filesz); |
978 | if (ret) | ||
979 | return ret; | ||
980 | } | ||
978 | 981 | ||
979 | if (mm) { | 982 | if (mm) { |
980 | if (phdr->p_flags & PF_X) { | 983 | if (phdr->p_flags & PF_X) { |
@@ -1014,7 +1017,7 @@ static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *params, | |||
1014 | struct elf32_fdpic_loadseg *seg; | 1017 | struct elf32_fdpic_loadseg *seg; |
1015 | struct elf32_phdr *phdr; | 1018 | struct elf32_phdr *phdr; |
1016 | unsigned long load_addr, delta_vaddr; | 1019 | unsigned long load_addr, delta_vaddr; |
1017 | int loop, dvset; | 1020 | int loop, dvset, ret; |
1018 | 1021 | ||
1019 | load_addr = params->load_addr; | 1022 | load_addr = params->load_addr; |
1020 | delta_vaddr = 0; | 1023 | delta_vaddr = 0; |
@@ -1114,7 +1117,9 @@ static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *params, | |||
1114 | * PT_LOAD */ | 1117 | * PT_LOAD */ |
1115 | if (prot & PROT_WRITE && disp > 0) { | 1118 | if (prot & PROT_WRITE && disp > 0) { |
1116 | kdebug("clear[%d] ad=%lx sz=%lx", loop, maddr, disp); | 1119 | kdebug("clear[%d] ad=%lx sz=%lx", loop, maddr, disp); |
1117 | clear_user((void __user *) maddr, disp); | 1120 | ret = clear_user((void __user *) maddr, disp); |
1121 | if (ret) | ||
1122 | return ret; | ||
1118 | maddr += disp; | 1123 | maddr += disp; |
1119 | } | 1124 | } |
1120 | 1125 | ||
@@ -1149,15 +1154,19 @@ static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *params, | |||
1149 | if (prot & PROT_WRITE && excess1 > 0) { | 1154 | if (prot & PROT_WRITE && excess1 > 0) { |
1150 | kdebug("clear[%d] ad=%lx sz=%lx", | 1155 | kdebug("clear[%d] ad=%lx sz=%lx", |
1151 | loop, maddr + phdr->p_filesz, excess1); | 1156 | loop, maddr + phdr->p_filesz, excess1); |
1152 | clear_user((void __user *) maddr + phdr->p_filesz, | 1157 | ret = clear_user((void __user *) maddr + phdr->p_filesz, |
1153 | excess1); | 1158 | excess1); |
1159 | if (ret) | ||
1160 | return ret; | ||
1154 | } | 1161 | } |
1155 | 1162 | ||
1156 | #else | 1163 | #else |
1157 | if (excess > 0) { | 1164 | if (excess > 0) { |
1158 | kdebug("clear[%d] ad=%lx sz=%lx", | 1165 | kdebug("clear[%d] ad=%lx sz=%lx", |
1159 | loop, maddr + phdr->p_filesz, excess); | 1166 | loop, maddr + phdr->p_filesz, excess); |
1160 | clear_user((void *) maddr + phdr->p_filesz, excess); | 1167 | ret = clear_user((void *) maddr + phdr->p_filesz, excess); |
1168 | if (ret) | ||
1169 | return ret; | ||
1161 | } | 1170 | } |
1162 | #endif | 1171 | #endif |
1163 | 1172 | ||
@@ -1379,7 +1388,7 @@ static void fill_prstatus(struct elf_prstatus *prstatus, | |||
1379 | prstatus->pr_sigpend = p->pending.signal.sig[0]; | 1388 | prstatus->pr_sigpend = p->pending.signal.sig[0]; |
1380 | prstatus->pr_sighold = p->blocked.sig[0]; | 1389 | prstatus->pr_sighold = p->blocked.sig[0]; |
1381 | prstatus->pr_pid = task_pid_vnr(p); | 1390 | prstatus->pr_pid = task_pid_vnr(p); |
1382 | prstatus->pr_ppid = task_pid_vnr(p->parent); | 1391 | prstatus->pr_ppid = task_pid_vnr(p->real_parent); |
1383 | prstatus->pr_pgrp = task_pgrp_vnr(p); | 1392 | prstatus->pr_pgrp = task_pgrp_vnr(p); |
1384 | prstatus->pr_sid = task_session_vnr(p); | 1393 | prstatus->pr_sid = task_session_vnr(p); |
1385 | if (thread_group_leader(p)) { | 1394 | if (thread_group_leader(p)) { |
@@ -1424,7 +1433,7 @@ static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p, | |||
1424 | psinfo->pr_psargs[len] = 0; | 1433 | psinfo->pr_psargs[len] = 0; |
1425 | 1434 | ||
1426 | psinfo->pr_pid = task_pid_vnr(p); | 1435 | psinfo->pr_pid = task_pid_vnr(p); |
1427 | psinfo->pr_ppid = task_pid_vnr(p->parent); | 1436 | psinfo->pr_ppid = task_pid_vnr(p->real_parent); |
1428 | psinfo->pr_pgrp = task_pgrp_vnr(p); | 1437 | psinfo->pr_pgrp = task_pgrp_vnr(p); |
1429 | psinfo->pr_sid = task_session_vnr(p); | 1438 | psinfo->pr_sid = task_session_vnr(p); |
1430 | 1439 | ||