diff options
author | Mike Frysinger <vapier@gentoo.org> | 2012-01-02 02:43:37 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2012-01-02 03:02:53 -0500 |
commit | 97774e90d694f802ff0cfbf15687af77c6f7239e (patch) | |
tree | 2c464c571ddb07f3a01cbc295700430bb52248f8 | |
parent | b3436addb5ccf14d7fffcf5503644e9a62aaec4e (diff) |
ldso: setup search path even when there are no "/"
If people use an interp path such as "ld.so", then there is no "/" found,
and we end up dereferencing a NULL pointer. Simplify the logic by having
a relative interp path like that be the same as "" (which the code later
on interprets as $PWD).
While we're here, document some of the nuances of this code.
Reported-by: Ignacy Gawędzki <uclibc@qult.net>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r-- | ldso/ldso/ldso.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c index c5ec2fde1..a6e916ee9 100644 --- a/ldso/ldso/ldso.c +++ b/ldso/ldso/ldso.c @@ -138,11 +138,23 @@ static void _dl_ldsopath_init(struct elf_resolve *tpnt) { char *ldsopath, *ptmp; - /* Store the path where the shared lib loader was found for later use */ + /* + * Store the path where the shared lib loader was found for later use. + * Note that this logic isn't bullet proof when it comes to relative + * paths: if you use "./lib/ldso.so", and then the app does chdir() + * followed by dlopen(), the old ldso path won't get searched. But + * that is a fairly pathological use case, so if you don't like that, + * then set a full path to your interp and be done :P. + */ ldsopath = _dl_strdup(tpnt->libname); ptmp = _dl_strrchr(ldsopath, '/'); - if (ptmp != ldsopath) - *ptmp = '\0'; + /* + * If there is no "/", then set the path to "", and the code + * later on will take this to implicitly mean "search $PWD". + */ + if (!ptmp) + ptmp = ldsopath; + *ptmp = '\0'; _dl_ldsopath = ldsopath; _dl_debug_early("Lib Loader: (%x) %s: using path: %s\n", |