]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
fix(install): handle $LIB in ldd output parsing
authorJaroslav Jindrak <dzejrou@gmail.com>
Fri, 7 May 2021 13:11:55 +0000 (15:11 +0200)
committerDaniel Molkentin <daniel@molkentin.de>
Mon, 10 May 2021 13:55:41 +0000 (15:55 +0200)
The ldd output can contain the variable $LIB, which is a documented feature of
ldd. In a previous commit [0], dracut-install received support for this
variable, but that was later reverted [1] due to issues [2][3] on Gentoo ARM64.

The part before '=>' does not necessarily refer to an existing file (e.g. due
to the usage of $LIB) and thus [1] could be seen as a regression to anyone
that uses this ldd feature. This PR combines both cases together and whenever
it find a '$' character (i.e. a variable) on the left side of the '=>' symbol,
it uses the right hand path (and thus uses evaluation done by ldd), otherwise
falls back to the behavior set by [1].

Reproducer that was presented to me:

$ grep "ibz.so" /etc/ld.so.preload || cat << EOF >> /etc/ld.so.preload
/\$LIB/libz.so.1.2.11
EOF
$ mkdir -p /var/tmp/dracut.xitk6p/initramfs
$ strace /usr/lib/dracut/dracut-install -D /var/tmp/dracut.xitk6p/initramfs -l /bin/bash 2>&1|grep ibz
$ rm -rf /var/tmp/dracut.xitk6p/

[0] 45404a2
[1] 6d886bb
[2] #471
[3] https://bugs.gentoo.org/667752

src/install/dracut-install.c

index b4eec363ae934b3aefdfdfe936efdebbae8510f5..9f044ae07c371f4331c0e6b24da94c85fffd1ab5 100644 (file)
@@ -589,7 +589,15 @@ static int resolve_deps(const char *src)
                 if (strstr(buf, destrootdir))
                         break;
 
-                p = strchr(buf, '/');
+                p = buf;
+                if (strchr(p, '$')) {
+                        /* take ldd variable expansion into account */
+                        p = strstr(p, "=>");
+                        if (!p)
+                                p = buf;
+                }
+                p = strchr(p, '/');
+
                 if (p) {
                         char *q;