honor rpath $ORIGIN for ldd/ldso command with program in working dir
authorRich Felker <dalias@aerifal.cx>
Wed, 7 Feb 2018 19:27:08 +0000 (14:27 -0500)
committerRich Felker <dalias@aerifal.cx>
Wed, 7 Feb 2018 19:27:08 +0000 (14:27 -0500)
the rpath fixup code assumed any module's name field would contain at
least one slash, an invariant which is usually met but not in the case
of a main executable loaded from the current working directory by
running ldd or ldso as a command. it would be possible to make this
invariant always hold, but it has a higher runtime allocation cost and
does not seem useful elsewhere, so just patch things up in fixup_rpath
instead.

ldso/dynlink.c

index 3380240..3741c30 100644 (file)
@@ -807,7 +807,16 @@ static int fixup_rpath(struct dso *p, char *buf, size_t buf_size)
                origin = p->name;
        }
        t = strrchr(origin, '/');
-       l = t ? t-origin : 0;
+       if (t) {
+               l = t-origin;
+       } else {
+               /* Normally p->name will always be an absolute or relative
+                * pathname containing at least one '/' character, but in the
+                * case where ldso was invoked as a command to execute a
+                * program in the working directory, app.name may not. Fix. */
+               origin = ".";
+               l = 1;
+       }
        p->rpath = malloc(strlen(p->rpath_orig) + n*l + 1);
        if (!p->rpath) return -1;