[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[HURD PATCH 7/7] _hurd_exec_file_name: canonicalize filename
From: |
Jeremie Koenig |
Subject: |
[HURD PATCH 7/7] _hurd_exec_file_name: canonicalize filename |
Date: |
Wed, 17 Aug 2011 21:35:32 +0200 |
* hurd/hurdexec.c (_hurd_exec_file_name): Canonicalize filename.
---
hurd/hurdexec.c | 14 ++++++++++++--
1 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/hurd/hurdexec.c b/hurd/hurdexec.c
index c2f45cf..4a69df4 100644
--- a/hurd/hurdexec.c
+++ b/hurd/hurdexec.c
@@ -47,46 +47,53 @@ link_warning (_hurd_exec,
/* Overlay TASK, executing FILE with arguments ARGV and environment ENVP.
If TASK == mach_task_self (), some ports are dealloc'd by the exec server.
ARGV and ENVP are terminated by NULL pointers. FILENAME is the path
(either absolute or relative) to FILE. Passing NULL, though possible,
should be avoided, since then the exec server may not know the path to
FILE if FILE is a script, and will then pass /dev/fd/N to the
interpreter. */
error_t
_hurd_exec_file_name (task_t task, file_t file, const char *filename,
char *const argv[], char *const envp[])
{
error_t err;
+ char *canonname;
char *args, *env;
size_t argslen, envlen;
int ints[INIT_INT_MAX];
mach_port_t ports[_hurd_nports];
struct hurd_userlink ulink_ports[_hurd_nports];
inline void free_port (unsigned int i)
{
_hurd_port_free (&_hurd_ports[i], &ulink_ports[i], ports[i]);
}
file_t *dtable;
unsigned int dtablesize, i;
struct hurd_port **dtable_cells;
struct hurd_userlink *ulink_dtable;
struct hurd_sigstate *ss;
mach_port_t *please_dealloc, *pdp;
int reauth = 0;
+ /* Canonicalize the filename for the sake of RPATH $ORIGIN substitution.
+ This is done here because we can't use __realpath from ld.so.
+ Also, realpath uses stat, which under fakeroot uses a socket, so we
+ must do this before _hurd_dtable_lock is acquired below. */
+ canonname = filename ? __realpath (filename, NULL) : NULL;
+
/* XXX needs to be hurdmalloc XXX */
if (argv == NULL)
args = NULL, argslen = 0;
else if (err = __argz_create (argv, &args, &argslen))
- return err;
+ goto outcanonname;
if (envp == NULL)
env = NULL, envlen = 0;
else if (err = __argz_create (envp, &env, &envlen))
goto outargs;
/* Load up the ports to give to the new program. */
for (i = 0; i < _hurd_nports; ++i)
if (i == INIT_PORT_PROC && task != __mach_task_self ())
{
/* This is another task, so we need to ask the proc server
for the right proc server port for it. */
if (err = __USEPORT (PROC, __proc_task2proc (port, task, &ports[i])))
@@ -373,33 +380,34 @@ _hurd_exec_file_name (task_t task, file_t file, const
char *filename,
}
flags = 0;
#ifdef EXEC_SIGTRAP
/* PTRACE_TRACEME sets all bits in _hurdsig_traced, which is
propagated through exec by INIT_TRACEMASK, so this checks if
PTRACE_TRACEME has been called in this process in any of its
current or prior lives. */
if (__sigismember (&_hurdsig_traced, SIGKILL))
flags |= EXEC_SIGTRAP;
#endif
err = __file_exec_file_name (file, task, flags,
- filename ? filename : "",
+ canonname ?: filename ?: "",
args, argslen, env, envlen,
dtable, MACH_MSG_TYPE_COPY_SEND, dtablesize,
ports, MACH_MSG_TYPE_COPY_SEND,
_hurd_nports,
ints, INIT_INT_MAX,
please_dealloc, pdp - please_dealloc,
&_hurd_msgport,
task == __mach_task_self () ? 1 : 0);
+
/* Fall back for backwards compatibility. This can just be removed
when __file_exec goes away. */
if (err == MIG_BAD_ID)
err = __file_exec (file, task, flags,
args, argslen, env, envlen,
dtable, MACH_MSG_TYPE_COPY_SEND, dtablesize,
ports, MACH_MSG_TYPE_COPY_SEND, _hurd_nports,
ints, INIT_INT_MAX,
please_dealloc, pdp - please_dealloc,
&_hurd_msgport,
task == __mach_task_self () ? 1 : 0);
}
@@ -425,14 +433,16 @@ _hurd_exec_file_name (task_t task, file_t file, const
char *filename,
__mach_port_deallocate (__mach_task_self (), dtable[i]);
/* Release lock on the file descriptor table. */
__mutex_unlock (&_hurd_dtable_lock);
/* Safe to let signals happen now. */
_hurd_critical_section_unlock (ss);
outargs:
free (args);
outenv:
free (env);
+ outcanonname:
+ free (canonname);
return err;
}
--
1.7.5.4
- [HURD PATCH 0/7] $ORIGIN substitution in RPATH, Jeremie Koenig, 2011/08/17
- [HURD PATCH 2/7] Add check for file_exec_file_name, Jeremie Koenig, 2011/08/17
- [HURD PATCH 1/7] Use the new file_exec_file_name RPC, Jeremie Koenig, 2011/08/17
- [HURD PATCH 3/7] Hurd startup: fetch the exec filename using exec_startup_get_info_2, Jeremie Koenig, 2011/08/17
- [HURD PATCH 4/7] Hurd dl-origin.c: start with a copy of elf/dl-origin.c, Jeremie Koenig, 2011/08/17
- [HURD PATCH 5/7] Hurd dl-origin.c: Use _hurd_init_filename if available, Jeremie Koenig, 2011/08/17
- [HURD PATCH 7/7] _hurd_exec_file_name: canonicalize filename,
Jeremie Koenig <=
- [HURD PATCH 6/7] Propagate _hurd_init_filename beyond dynamic loading, Jeremie Koenig, 2011/08/17