]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: Keep the mnt_tab info for the existent dest in mnt_copy_fs()
authorKevin Hao <kexin.hao@windriver.com>
Mon, 19 Aug 2019 08:30:22 +0000 (16:30 +0800)
committerKarel Zak <kzak@redhat.com>
Mon, 19 Aug 2019 12:36:55 +0000 (14:36 +0200)
The "umount -f -a -r" get stuck in a endless loop when run with a
mountinfo like below:
  15 0 179:2 / / ro,relatime - ext4 /dev/root ro
  16 15 0:6 / /dev rw,relatime - devtmpfs devtmpfs rw,size=242896k,nr_inodes=60724,mode=755
  17 15 0:4 / /proc rw,relatime - proc proc rw
  18 15 0:15 / /mnt/.psplash rw,relatime - tmpfs tmpfs rw,size=40k
  19 15 0:16 / /sys rw,relatime - sysfs sysfs rw
  20 19 0:7 / /sys/kernel/debug rw,relatime - debugfs debugfs rw
  21 15 0:17 / /run rw,nosuid,nodev - tmpfs tmpfs rw,mode=755
  22 15 0:18 / /var/volatile rw,relatime - tmpfs tmpfs rw
  23 15 179:1 / /boot rw,relatime - vfat /dev/mmcblk0p1 rw,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro
  24 16 0:19 / /dev/pts rw,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=000
  25 18 0:20 / /mnt/.psplash rw,relatime - tmpfs tmpfs rw,size=40k

The reason is that the two same mnt entry "/mnt/.psplash" will cause
the dst->tab set to NULL when umount this mnt entry the second time.
This will trigger an endless loop in mnt_reset_table() because that
mnt entry is linked on the libmnt_table but its .tab is set to NULL.

Signed-off-by: Kevin Hao <kexin.hao@windriver.com>
libmount/src/fs.c

index eb89bb8a39bea820eabea275f196b74792ded6b3..4126ee9dce85b3d67b23e90b263bdded2418c25c 100644 (file)
@@ -188,9 +188,10 @@ struct libmnt_fs *mnt_copy_fs(struct libmnt_fs *dest,
                dest = mnt_new_fs();
                if (!dest)
                        return NULL;
+
+               dest->tab        = NULL;
        }
 
-       dest->tab        = NULL;
        dest->id         = src->id;
        dest->parent     = src->parent;
        dest->devno      = src->devno;