diff options
author | Jaroslav Jindrak <dzejrou@gmail.com> | 2021-05-07 15:11:55 +0200 |
---|---|---|
committer | Daniel Molkentin <daniel@molkentin.de> | 2021-05-10 15:55:41 +0200 |
commit | d1a36d3d80b0ed71ee814659e18a020c53cee05e (patch) | |
tree | 5997d09f5cace52985dc57950adc43036988261d | |
parent | 3697891b754493ecd6b19dbf279701bad3460fcd (diff) | |
download | dracut-d1a36d3d80b0ed71ee814659e18a020c53cee05e.tar.gz |
fix(install): handle $LIB in ldd output parsing
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
-rw-r--r-- | src/install/dracut-install.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/install/dracut-install.c b/src/install/dracut-install.c index b4eec363..9f044ae0 100644 --- a/src/install/dracut-install.c +++ b/src/install/dracut-install.c @@ -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; |