aboutsummaryrefslogtreecommitdiff
path: root/exec/hashexec.c
diff options
context:
space:
mode:
Diffstat (limited to 'exec/hashexec.c')
-rw-r--r--exec/hashexec.c91
1 files changed, 43 insertions, 48 deletions
diff --git a/exec/hashexec.c b/exec/hashexec.c
index a1072917..09536798 100644
--- a/exec/hashexec.c
+++ b/exec/hashexec.c
@@ -221,14 +221,14 @@ check_hashbang (struct execdata *e,
if (! e->error)
{
- int free_file_name = 0; /* True if we should free FILE_NAME. */
+ char * volatile file_name_to_free = NULL; /* Will free this if set. */
jmp_buf args_faulted;
void fault_handler (int signo)
{ longjmp (args_faulted, 1); }
error_t setup_args (struct hurd_signal_preemptor *preemptor)
{
size_t namelen;
- char * volatile file_name = NULL;
+ const char * volatile file_name = NULL;
if (setjmp (args_faulted))
file_name = NULL;
@@ -242,44 +242,42 @@ check_hashbang (struct execdata *e,
named by ARGV[0] in the `PATH' environment variable
might find it. */
- error_t error;
- char *name;
- int free_name = 0; /* True if we should free NAME. */
- file_t name_file;
- mach_port_t fileid, filefsid;
- ino_t fileno;
-
- /* Search $PATH for NAME, opening a port NAME_FILE on it.
- This is encapsulated in a function so we can catch faults
- reading the user's environment. */
- error_t search_path (struct hurd_signal_preemptor *preemptor)
+ if (file_name_exec && file_name_exec[0] != '\0')
+ file_name = file_name_exec;
+ else
{
- error_t err;
- char *path = envz_get (envp, envplen, "PATH"), *pfxed_name;
-
- if (! path)
+ error_t error;
+ file_t name_file;
+ mach_port_t fileid, filefsid;
+ ino_t fileno;
+ char *name;
+ /* Search $PATH for NAME, opening a port NAME_FILE on it.
+ This is encapsulated in a function so we can catch faults
+ reading the user's environment. */
+ error_t search_path (struct hurd_signal_preemptor *preemptor)
{
- const size_t len = confstr (_CS_PATH, NULL, 0);
- path = alloca (len);
- confstr (_CS_PATH, path, len);
- }
+ error_t err;
+ char *path = envz_get (envp, envplen, "PATH"), *pfxed_name;
- err = hurd_file_name_path_lookup (user_port, user_fd, 0,
- name, path, O_EXEC, 0,
- &name_file, &pfxed_name);
- if (!err && pfxed_name)
- {
- name = pfxed_name;
- free_name = 1;
- }
+ if (! path)
+ {
+ const size_t len = confstr (_CS_PATH, NULL, 0);
+ path = alloca (len);
+ confstr (_CS_PATH, path, len);
+ }
- return err;
- }
+ err = hurd_file_name_path_lookup (user_port, user_fd, 0,
+ name, path, O_EXEC, 0,
+ &name_file, &pfxed_name);
+ if (!err && pfxed_name)
+ {
+ name = pfxed_name;
+ file_name_to_free = pfxed_name;
+ }
+
+ return err;
+ }
- if (file_name_exec && file_name_exec[0] != '\0')
- name = file_name_exec;
- else
- {
/* Try to locate the file. */
error = io_identity (file, &fileid, &filefsid, &fileno);
if (error)
@@ -320,15 +318,10 @@ check_hashbang (struct execdata *e,
}
mach_port_deallocate (mach_task_self (), fileid);
- }
- if (!error)
- {
- file_name = name;
- free_file_name = free_name;
+ if (!error)
+ file_name = name;
}
- else if (free_name)
- free (name);
}
if (file_name == NULL)
@@ -354,8 +347,9 @@ check_hashbang (struct execdata *e,
mach_port_mod_refs (mach_task_self (), file,
MACH_PORT_RIGHT_SEND, +1);
- file_name = alloca (100);
- sprintf (file_name, "/dev/fd/%d", fd);
+ char *fd_file_name = alloca (100);
+ sprintf (fd_file_name, "/dev/fd/%d", fd);
+ file_name = fd_file_name;
}
/* Prepare the arguments to pass to the interpreter from the original
@@ -374,7 +368,7 @@ check_hashbang (struct execdata *e,
if (new_argv == (caddr_t) -1)
{
e->error = errno;
- return e->error;
+ goto end_setup_args;
}
else
e->error = 0;
@@ -414,10 +408,11 @@ check_hashbang (struct execdata *e,
memcpy (memcpy (n, arg, arg_len) + arg_len, file_name, namelen);
}
- if (free_file_name)
- free (file_name);
+end_setup_args:
+ if (file_name_to_free)
+ free (file_name_to_free);
- return 0;
+ return e->error;
}
/* Set up the arguments. */