--- ./fs/binfmt_elf.c.fsfix 2006-03-27 14:25:59.000000000 +0400 +++ ./fs/binfmt_elf.c 2006-03-28 13:26:16.000000000 +0400 @@ -1027,8 +1027,13 @@ out_free_file: sys_close(elf_exec_fileno); out_free_fh: if (files) { - put_files_struct(current->files); + struct files_struct *old; + + old = current->files; + task_lock(current); current->files = files; + task_unlock(current); + put_files_struct(old); } out_free_ph: kfree(elf_phdata); --- ./fs/binfmt_misc.c.fsfix 2006-03-27 14:25:59.000000000 +0400 +++ ./fs/binfmt_misc.c 2006-03-28 13:27:06.000000000 +0400 @@ -216,8 +216,13 @@ _error: bprm->interp_data = 0; _unshare: if (files) { - put_files_struct(current->files); + struct files_struct *old; + + old = current->files; + task_lock(current); current->files = files; + task_unlock(current); + put_files_struct(old); } goto _ret; } --- ./fs/exec.c.fsfix 2006-03-27 14:25:59.000000000 +0400 +++ ./fs/exec.c 2006-03-28 13:28:10.000000000 +0400 @@ -865,7 +865,7 @@ int flush_old_exec(struct linux_binprm * { char * name; int i, ch, retval; - struct files_struct *files; + struct files_struct *files, *old; char tcomm[sizeof(current->comm)]; /* @@ -946,8 +946,11 @@ int flush_old_exec(struct linux_binprm * return 0; mmap_failed: - put_files_struct(current->files); + old = current->files; + task_lock(current); current->files = files; + task_unlock(current); + put_files_struct(old); out: return retval; }