Skip to content

Commit 32f6f36

Browse files
aafeijoo-suseLaszloGombos
authored andcommitted
fix(dracut-install): protect against broken links pointing to themselves
`readlink` does not return an error if a symbolic link points to itself, which can cause a stack overflow due to infinite recursion in the `get_real_file` function. Although this type of recursive links should not exist, we discovered this issue on a real system. It can be reproduced as follows: ``` > ls -l /lib64/libblkid.so -rwxr-xr-x 1 root root 224368 Aug 9 15:13 /lib64/libblkid.so > rm -f /lib64/libblkid.so > ln -s /lib64/libblkid.so /lib64/libblkid.so > ls -l /lib64/libblkid.so lrwxrwxrwx 1 root root 18 Aug 9 15:06 /lib64/libblkid.so -> /lib64/libblkid.so > dracut -f -I "/lib64/libblkid.so" test.img ... dracut-install: Handle '/lib64/libblkid.so' dracut-install: dracut_install('/lib64/libblkid.so', '/lib64/libblkid.so', 0, 0, 1) dracut-install: get_real_file('/lib64/libblkid.so') dracut-install: get_real_file: readlink('/lib64/libblkid.so') returns '/lib64/libblkid.so' dracut-install: get_real_file('/lib64/libblkid.so') => '/lib64/libblkid.so' ... [infinite recursion] ... dracut-install: dracut_install('/lib64/libblkid.so', '/lib64/libblkid.so', 0, 0, 1) dracut-install: get_real_file('/lib64/libblkid.so') dracut-install: get_real_file: readlink('/lib64/libblkid.so') returns '/lib64/libblkid.so' dracut-install: get_real_file('/lib64/libblkid.so') => '/lib64/libblkid.so' dracut-install: dracut_install('/lib64/libblkid.so', '/lib64/libblkid.so', 0, 0, 1) /usr/lib/dracut/dracut-init.sh: line 298: 20949 Segmentation fault (core dumped) $DRACUT_INSTALL ${dracutsysrootdir:+-r "$dracutsysrootdir"} ${initdir:+-D "$initdir"} -a ${loginstall:+-L "$loginstall"} ${DRACUT_RESOLVE_DEPS:+-l} ${DRACUT_FIPS_MODE:+-f} ${_hostonly_install:+-H} "$@" dracut: FAILED: /usr/lib/dracut/dracut-install --debug -D /var/tmp/dracut.dqLmOS/initramfs -a /lib64/libblkid.so ... ``` After applying this patch: ``` > dracut -f -I "/lib64/libblkid.so" test.img ... dracut-install: Handle '/lib64/libblkid.so' dracut-install: dracut_install('/lib64/libblkid.so', '/lib64/libblkid.so', 0, 0, 1) dracut-install: get_real_file('/lib64/libblkid.so') dracut-install: get_real_file: readlink('/lib64/libblkid.so') returns '/lib64/libblkid.so' dracut-install: ERROR: '/lib64/libblkid.so' is pointing to itself. dracut-install: ERROR: installing '/lib64/libblkid.so' dracut: FAILED: /usr/lib/dracut/dracut-install --debug -D /var/tmp/dracut.4w8FVL/initramfs -a /lib64/libblkid.so ... ```
1 parent b2c6b58 commit 32f6f36

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

src/install/dracut-install.c

+5
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,11 @@ static char *get_real_file(const char *src, bool fullyresolve)
480480

481481
log_debug("get_real_file: readlink('%s') returns '%s'", fullsrcpath, linktarget);
482482

483+
if (streq(fullsrcpath, linktarget)) {
484+
log_error("ERROR: '%s' is pointing to itself", fullsrcpath);
485+
return NULL;
486+
}
487+
483488
if (linktarget[0] == '/') {
484489
_asprintf(&abspath, "%s%s", (sysrootdirlen ? sysrootdir : ""), linktarget);
485490
} else {

0 commit comments

Comments
 (0)