|
@@ -1084,9 +1084,12 @@ int flush_old_exec(struct linux_binprm * bprm)
|
|
|
*/
|
|
|
current->mm->task_size = TASK_SIZE;
|
|
|
|
|
|
- if (bprm->e_uid != current->euid || bprm->e_gid != current->egid ||
|
|
|
- file_permission(bprm->file, MAY_READ) ||
|
|
|
- (bprm->interp_flags & BINPRM_FLAGS_ENFORCE_NONDUMP)) {
|
|
|
+ if (bprm->e_uid != current->euid || bprm->e_gid != current->egid) {
|
|
|
+ suid_keys(current);
|
|
|
+ set_dumpable(current->mm, suid_dumpable);
|
|
|
+ current->pdeath_signal = 0;
|
|
|
+ } else if (file_permission(bprm->file, MAY_READ) ||
|
|
|
+ (bprm->interp_flags & BINPRM_FLAGS_ENFORCE_NONDUMP)) {
|
|
|
suid_keys(current);
|
|
|
set_dumpable(current->mm, suid_dumpable);
|
|
|
}
|
|
@@ -1177,8 +1180,10 @@ void compute_creds(struct linux_binprm *bprm)
|
|
|
{
|
|
|
int unsafe;
|
|
|
|
|
|
- if (bprm->e_uid != current->uid)
|
|
|
+ if (bprm->e_uid != current->uid) {
|
|
|
suid_keys(current);
|
|
|
+ current->pdeath_signal = 0;
|
|
|
+ }
|
|
|
exec_keys(current);
|
|
|
|
|
|
task_lock(current);
|