OSDN Git Service

ldso: setup search path even when there are no "/"
authorMike Frysinger <vapier@gentoo.org>
Mon, 2 Jan 2012 07:43:37 +0000 (02:43 -0500)
committerMike Frysinger <vapier@gentoo.org>
Mon, 2 Jan 2012 08:02:53 +0000 (03:02 -0500)
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>
ldso/ldso/ldso.c

index c5ec2fd..a6e916e 100644 (file)
@@ -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",