|
@@ -119,9 +119,7 @@ static void set_brk(unsigned long start, unsigned long end)
|
|
end = PAGE_ALIGN(end);
|
|
end = PAGE_ALIGN(end);
|
|
if (end <= start)
|
|
if (end <= start)
|
|
return;
|
|
return;
|
|
- down_write(¤t->mm->mmap_sem);
|
|
|
|
- do_brk(start, end - start);
|
|
|
|
- up_write(¤t->mm->mmap_sem);
|
|
|
|
|
|
+ vm_brk(start, end - start);
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CORE_DUMP
|
|
#ifdef CORE_DUMP
|
|
@@ -332,9 +330,7 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
|
pos = 32;
|
|
pos = 32;
|
|
map_size = ex.a_text+ex.a_data;
|
|
map_size = ex.a_text+ex.a_data;
|
|
|
|
|
|
- down_write(¤t->mm->mmap_sem);
|
|
|
|
- error = do_brk(text_addr & PAGE_MASK, map_size);
|
|
|
|
- up_write(¤t->mm->mmap_sem);
|
|
|
|
|
|
+ error = vm_brk(text_addr & PAGE_MASK, map_size);
|
|
|
|
|
|
if (error != (text_addr & PAGE_MASK)) {
|
|
if (error != (text_addr & PAGE_MASK)) {
|
|
send_sig(SIGKILL, current, 0);
|
|
send_sig(SIGKILL, current, 0);
|
|
@@ -373,9 +369,7 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
|
if (!bprm->file->f_op->mmap || (fd_offset & ~PAGE_MASK) != 0) {
|
|
if (!bprm->file->f_op->mmap || (fd_offset & ~PAGE_MASK) != 0) {
|
|
loff_t pos = fd_offset;
|
|
loff_t pos = fd_offset;
|
|
|
|
|
|
- down_write(¤t->mm->mmap_sem);
|
|
|
|
- do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
|
|
|
|
- up_write(¤t->mm->mmap_sem);
|
|
|
|
|
|
+ vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
|
|
bprm->file->f_op->read(bprm->file,
|
|
bprm->file->f_op->read(bprm->file,
|
|
(char __user *)N_TXTADDR(ex),
|
|
(char __user *)N_TXTADDR(ex),
|
|
ex.a_text+ex.a_data, &pos);
|
|
ex.a_text+ex.a_data, &pos);
|
|
@@ -385,26 +379,22 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
|
goto beyond_if;
|
|
goto beyond_if;
|
|
}
|
|
}
|
|
|
|
|
|
- down_write(¤t->mm->mmap_sem);
|
|
|
|
- error = do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text,
|
|
|
|
|
|
+ error = vm_mmap(bprm->file, N_TXTADDR(ex), ex.a_text,
|
|
PROT_READ | PROT_EXEC,
|
|
PROT_READ | PROT_EXEC,
|
|
MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE |
|
|
MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE |
|
|
MAP_EXECUTABLE | MAP_32BIT,
|
|
MAP_EXECUTABLE | MAP_32BIT,
|
|
fd_offset);
|
|
fd_offset);
|
|
- up_write(¤t->mm->mmap_sem);
|
|
|
|
|
|
|
|
if (error != N_TXTADDR(ex)) {
|
|
if (error != N_TXTADDR(ex)) {
|
|
send_sig(SIGKILL, current, 0);
|
|
send_sig(SIGKILL, current, 0);
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
|
|
|
|
- down_write(¤t->mm->mmap_sem);
|
|
|
|
- error = do_mmap(bprm->file, N_DATADDR(ex), ex.a_data,
|
|
|
|
|
|
+ error = vm_mmap(bprm->file, N_DATADDR(ex), ex.a_data,
|
|
PROT_READ | PROT_WRITE | PROT_EXEC,
|
|
PROT_READ | PROT_WRITE | PROT_EXEC,
|
|
MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE |
|
|
MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE |
|
|
MAP_EXECUTABLE | MAP_32BIT,
|
|
MAP_EXECUTABLE | MAP_32BIT,
|
|
fd_offset + ex.a_text);
|
|
fd_offset + ex.a_text);
|
|
- up_write(¤t->mm->mmap_sem);
|
|
|
|
if (error != N_DATADDR(ex)) {
|
|
if (error != N_DATADDR(ex)) {
|
|
send_sig(SIGKILL, current, 0);
|
|
send_sig(SIGKILL, current, 0);
|
|
return error;
|
|
return error;
|
|
@@ -476,9 +466,7 @@ static int load_aout_library(struct file *file)
|
|
error_time = jiffies;
|
|
error_time = jiffies;
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
- down_write(¤t->mm->mmap_sem);
|
|
|
|
- do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
|
|
|
|
- up_write(¤t->mm->mmap_sem);
|
|
|
|
|
|
+ vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
|
|
|
|
|
|
file->f_op->read(file, (char __user *)start_addr,
|
|
file->f_op->read(file, (char __user *)start_addr,
|
|
ex.a_text + ex.a_data, &pos);
|
|
ex.a_text + ex.a_data, &pos);
|
|
@@ -490,12 +478,10 @@ static int load_aout_library(struct file *file)
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
/* Now use mmap to map the library into memory. */
|
|
/* Now use mmap to map the library into memory. */
|
|
- down_write(¤t->mm->mmap_sem);
|
|
|
|
- error = do_mmap(file, start_addr, ex.a_text + ex.a_data,
|
|
|
|
|
|
+ error = vm_mmap(file, start_addr, ex.a_text + ex.a_data,
|
|
PROT_READ | PROT_WRITE | PROT_EXEC,
|
|
PROT_READ | PROT_WRITE | PROT_EXEC,
|
|
MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_32BIT,
|
|
MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_32BIT,
|
|
N_TXTOFF(ex));
|
|
N_TXTOFF(ex));
|
|
- up_write(¤t->mm->mmap_sem);
|
|
|
|
retval = error;
|
|
retval = error;
|
|
if (error != start_addr)
|
|
if (error != start_addr)
|
|
goto out;
|
|
goto out;
|
|
@@ -503,9 +489,7 @@ static int load_aout_library(struct file *file)
|
|
len = PAGE_ALIGN(ex.a_text + ex.a_data);
|
|
len = PAGE_ALIGN(ex.a_text + ex.a_data);
|
|
bss = ex.a_text + ex.a_data + ex.a_bss;
|
|
bss = ex.a_text + ex.a_data + ex.a_bss;
|
|
if (bss > len) {
|
|
if (bss > len) {
|
|
- down_write(¤t->mm->mmap_sem);
|
|
|
|
- error = do_brk(start_addr + len, bss - len);
|
|
|
|
- up_write(¤t->mm->mmap_sem);
|
|
|
|
|
|
+ error = vm_brk(start_addr + len, bss - len);
|
|
retval = error;
|
|
retval = error;
|
|
if (error != start_addr + len)
|
|
if (error != start_addr + len)
|
|
goto out;
|
|
goto out;
|