*/
static Node *check_file(struct linux_binprm *bprm)
{
- char *p = strrchr(bprm->filename, '.');
+ char *p = strrchr(bprm->interp, '.');
struct list_head *l;
list_for_each(l, &entries) {
if (!(fmt->flags & MISC_FMT_PRESERVE_ARGV0)) {
remove_arg_zero(bprm);
}
- retval = copy_strings_kernel(1, &bprm->filename, bprm);
+ retval = copy_strings_kernel(1, &bprm->interp, bprm);
if (retval < 0) goto _ret;
bprm->argc++;
retval = copy_strings_kernel(1, &iname_addr, bprm);
if (retval < 0) goto _ret;
bprm->argc++;
- bprm->filename = iname; /* for binfmt_script */
+ bprm->interp = iname; /* for binfmt_script */
file = open_exec(iname);
retval = PTR_ERR(file);
* user environment and arguments are stored.
*/
remove_arg_zero(bprm);
- retval = copy_strings_kernel(1, &bprm->filename, bprm);
+ retval = copy_strings_kernel(1, &bprm->interp, bprm);
if (retval < 0) return retval;
bprm->argc++;
if (i_arg) {
retval = copy_strings_kernel(1, &i_name, bprm);
if (retval) return retval;
bprm->argc++;
+ bprm->interp = interp;
+
/*
* OK, now restart the process with the interpreter's dentry.
*/
bprm.file = file;
bprm.filename = filename;
+ bprm.interp = filename;
bprm.sh_bang = 0;
bprm.loader = 0;
bprm.exec = 0;
kernel_cap_t cap_inheritable, cap_permitted, cap_effective;
void *security;
int argc, envc;
- char * filename; /* Name of binary */
+ char * filename; /* Name of binary as seen by procps */
+ char * interp; /* Name of the binary really executed. Most
+ of the time same as filename, but could be
+ different for binfmt_{misc,script} */
unsigned long loader, exec;
};