patch-2.2.19 linux/fs/exec.c
Next file: linux/fs/fat/misc.c
Previous file: linux/fs/dquot.c
Back to the patch index
Back to the overall index
- Lines: 86
- Date:
Sun Mar 25 11:37:38 2001
- Orig file:
v2.2.18/fs/exec.c
- Orig date:
Sun Mar 25 11:28:33 2001
diff -u --new-file --recursive --exclude-from /usr/src/exclude v2.2.18/fs/exec.c linux/fs/exec.c
@@ -517,8 +517,9 @@
current->sas_ss_sp = current->sas_ss_size = 0;
+ bprm->dumpable = 0;
if (current->euid == current->uid && current->egid == current->gid)
- current->dumpable = 1;
+ bprm->dumpable = !bprm->priv_change;
name = bprm->filename;
for (i=0; (ch = *(name++)) != '\0';) {
if (ch == '/')
@@ -531,10 +532,10 @@
flush_thread();
- if (bprm->e_uid != current->euid || bprm->e_gid != current->egid ||
- permission(bprm->dentry->d_inode,MAY_READ))
- current->dumpable = 0;
-
+ if (bprm->e_uid != current->euid || bprm->e_gid != current->egid ||
+ permission(bprm->dentry->d_inode, MAY_READ))
+ bprm->dumpable = 0;
+
current->self_exec_id++;
flush_signal_handlers(current);
@@ -646,7 +647,8 @@
}
}
- if (id_change || cap_raised) {
+ bprm->priv_change = id_change || cap_raised;
+ if (bprm->priv_change) {
/* We can't suid-execute if we're sharing parts of the executable */
/* or if we're being traced (or if suid execs are not allowed) */
/* (current->mm->count > 1 is ok, as we'll get a new mm anyway) */
@@ -704,7 +706,7 @@
current->sgid = current->egid = current->fsgid = bprm->e_gid;
if (current->euid != current->uid || current->egid != current->gid ||
!cap_issubset(new_permitted, current->cap_permitted))
- current->dumpable = 0;
+ bprm->dumpable = 0;
current->keep_capabilities = 0;
}
@@ -823,6 +825,7 @@
{
struct linux_binprm bprm;
struct dentry * dentry;
+ int was_dumpable;
int retval;
int i;
@@ -851,6 +854,9 @@
return bprm.envc;
}
+ was_dumpable = current->dumpable;
+ current->dumpable = 0;
+
retval = prepare_binprm(&bprm);
if (retval >= 0) {
@@ -864,9 +870,12 @@
if (retval >= 0)
retval = search_binary_handler(&bprm,regs);
- if (retval >= 0)
+
+ if (retval >= 0) {
/* execve success */
+ current->dumpable = bprm.dumpable;
return retval;
+ }
/* Something went wrong, return the inode and free the argument pages*/
if (bprm.dentry)
@@ -874,6 +883,8 @@
for (i=0 ; i<MAX_ARG_PAGES ; i++)
free_page(bprm.page[i]);
+
+ current->dumpable = was_dumpable;
return retval;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)