diff --git a/fs/exec.c b/fs/exec.c index 4b31a72..58ddc95 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1278,7 +1278,6 @@ void free_bprm(struct linux_binprm *bprm) { free_arg_pages(bprm); if (bprm->cred) { - mutex_unlock(¤t->cred_exec_mutex); abort_creds(bprm->cred); } kfree(bprm); @@ -1301,25 +1300,25 @@ int do_execve(char * filename, if (retval) goto out_ret; + retval = mutex_lock_interruptible(¤t->cred_exec_mutex); + if (retval < 0) + goto out_files; + retval = -ENOMEM; bprm = kzalloc(sizeof(*bprm), GFP_KERNEL); if (!bprm) - goto out_files; - - retval = mutex_lock_interruptible(¤t->cred_exec_mutex); - if (retval < 0) - goto out_free; + goto out_unlock; retval = -ENOMEM; bprm->cred = prepare_exec_creds(); if (!bprm->cred) - goto out_unlock; + goto out_free; check_unsafe_exec(bprm); file = open_exec(filename); retval = PTR_ERR(file); if (IS_ERR(file)) - goto out_unlock; + goto out_free; sched_exec(); @@ -1362,6 +1361,7 @@ int do_execve(char * filename, /* execve success */ acct_update_integrals(current); free_bprm(bprm); + mutex_unlock(¤t->cred_exec_mutex); if (displaced) put_files_struct(displaced); return retval; @@ -1377,12 +1377,12 @@ out_file: fput(bprm->file); } -out_unlock: - mutex_unlock(¤t->cred_exec_mutex); - out_free: free_bprm(bprm); +out_unlock: + mutex_unlock(¤t->cred_exec_mutex); + out_files: if (displaced) reset_files_struct(displaced);