--- 2.2.13pre14-zmagic/fs/binfmt_aout.c.~1~ Tue Sep 28 18:32:37 1999 +++ 2.2.13pre14-zmagic/fs/binfmt_aout.c Thu Sep 30 16:54:57 1999 @@ -311,7 +311,6 @@ unsigned long fd_offset; unsigned long rlim; int retval; - static unsigned long error_time=0; ex = *((struct exec *) bprm->buf); /* exec-header */ if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != OMAGIC && @@ -323,6 +322,7 @@ fd_offset = N_TXTOFF(ex); +#if 0 #ifdef __i386__ if (N_MAGIC(ex) == ZMAGIC && fd_offset != BLOCK_SIZE) { if((jiffies-error_time) >5) @@ -337,6 +337,7 @@ bprm->dentry->d_inode->i_op && bprm->dentry->d_inode->i_op->bmap && (fd_offset < bprm->dentry->d_inode->i_sb->s_blocksize)) { + static unsigned long error_time=0; if((jiffies-error_time) >5) { printk(KERN_NOTICE "N_TXTOFF < BLOCK_SIZE. Please convert binary.\n"); @@ -345,6 +346,7 @@ return -ENOEXEC; } #endif +#endif /* Check initial limits. This avoids letting people circumvent * size limits imposed on them by creating programs with large @@ -420,13 +422,22 @@ fd = open_dentry(bprm->dentry, O_RDONLY); if (fd < 0) return fd; - file = fcheck(fd); + file = fget(fd); + + if ((fd_offset & ~PAGE_MASK) != 0) { + printk(KERN_WARNING + "fd_offset is not page aligned. Please convert program: %s\n", + file->f_dentry->d_name.name + ); + } - if (!file->f_op || !file->f_op->mmap) { + if (!file->f_op || !file->f_op->mmap || ((fd_offset & ~PAGE_MASK) != 0)) { + fput(file); sys_close(fd); - do_mmap(NULL, 0, ex.a_text+ex.a_data, - PROT_READ|PROT_WRITE|PROT_EXEC, - MAP_FIXED|MAP_PRIVATE, 0); + error = do_mmap(NULL, N_TXTADDR(ex), + ex.a_text+ex.a_data, + PROT_READ|PROT_WRITE|PROT_EXEC, + MAP_FIXED|MAP_PRIVATE, 0); read_exec(bprm->dentry, fd_offset, (char *) N_TXTADDR(ex), ex.a_text+ex.a_data, 0); flush_icache_range((unsigned long) N_TXTADDR(ex), @@ -441,6 +452,7 @@ fd_offset); if (error != N_TXTADDR(ex)) { + fput(file); sys_close(fd); send_sig(SIGKILL, current, 0); return error; @@ -450,6 +462,7 @@ PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, fd_offset + ex.a_text); + fput(file); sys_close(fd); if (error != N_DATADDR(ex)) { send_sig(SIGKILL, current, 0); @@ -529,11 +542,13 @@ goto out_putf; } +#if 0 if (N_MAGIC(ex) == ZMAGIC && N_TXTOFF(ex) && (N_TXTOFF(ex) < inode->i_sb->s_blocksize)) { printk("N_TXTOFF < BLOCK_SIZE. Please convert library\n"); goto out_putf; } +#endif if (N_FLAGS(ex)) goto out_putf; @@ -543,6 +558,28 @@ start_addr = ex.a_entry & 0xfffff000; + if ((N_TXTOFF(ex) & ~PAGE_MASK) != 0) { + unsigned long __start, __end; + + printk(KERN_WARNING + "N_TXTOFF is not page aligned. Please convert library: %s\n", + file->f_dentry->d_name.name + ); + + __start = start_addr & PAGE_MASK; + __end = start_addr + ex.a_text + ex.a_data + ex.a_bss; + do_mmap(NULL, __start, __end - __start, + PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_FIXED| MAP_PRIVATE, 0); + + read_exec(file->f_dentry, N_TXTOFF(ex), + (char *)start_addr, ex.a_text + ex.a_data, 0); + flush_icache_range((unsigned long) start_addr, + (unsigned long) start_addr + ex.a_text + ex.a_data); + + retval = 0; + goto out_putf; + } /* Now use mmap to map the library into memory. */ error = do_mmap(file, start_addr, ex.a_text + ex.a_data, PROT_READ | PROT_WRITE | PROT_EXEC,