From 97774e90d694f802ff0cfbf15687af77c6f7239e Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Mon, 2 Jan 2012 02:43:37 -0500 Subject: ldso: setup search path even when there are no "/" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Mike Frysinger --- ldso/ldso/ldso.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'ldso') 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", -- cgit v1.2.3