diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2019-04-29 17:59:08 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2019-04-29 17:59:08 +0200 |
commit | f3a064f4956e113978e74486300dcd1e3e044efa (patch) | |
tree | 1a122c33fd15dce4563cd70e3c3e2c852578986b | |
parent | fa8878bf1fe331df752395cce90da212e25e07b7 (diff) | |
download | busybox-w32-f3a064f4956e113978e74486300dcd1e3e044efa.tar.gz busybox-w32-f3a064f4956e113978e74486300dcd1e3e044efa.tar.bz2 busybox-w32-f3a064f4956e113978e74486300dcd1e3e044efa.zip |
libbbb: find_mount_point() too eager to stat mounted devices
None of the below "devices" (first word on the line) are real.
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
devtmpfs /dev devtmpfs rw,nosuid,size=7917900k,nr_inodes=1979475,mode=755 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /run tmpfs rw,nosuid,nodev,mode=755 0 0
pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0
configfs /sys/kernel/config configfs rw,relatime 0 0
tmpfs /tmp tmpfs rw,relatime 0 0
function old new delta
find_mount_point 297 302 +5
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | libbb/find_mount_point.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/libbb/find_mount_point.c b/libbb/find_mount_point.c index 94bbf1d4a..0e1be3820 100644 --- a/libbb/find_mount_point.c +++ b/libbb/find_mount_point.c | |||
@@ -56,11 +56,22 @@ struct mntent* FAST_FUNC find_mount_point(const char *name, int subdir_too) | |||
56 | continue; | 56 | continue; |
57 | 57 | ||
58 | /* Is device's dev_t == name's dev_t? */ | 58 | /* Is device's dev_t == name's dev_t? */ |
59 | if (stat(mountEntry->mnt_fsname, &s) == 0 && s.st_rdev == devno_of_name) | 59 | if (mountEntry->mnt_fsname[0] == '/' |
60 | /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
61 | * avoid stat'ing "sysfs", "proc", "none" and such, | ||
62 | * useless at best, can stat unrelated files at worst. | ||
63 | */ | ||
64 | && stat(mountEntry->mnt_fsname, &s) == 0 | ||
65 | && s.st_rdev == devno_of_name | ||
66 | ) { | ||
60 | break; | 67 | break; |
68 | } | ||
61 | /* Match the directory's mount point. */ | 69 | /* Match the directory's mount point. */ |
62 | if (stat(mountEntry->mnt_dir, &s) == 0 && s.st_dev == devno_of_name) | 70 | if (stat(mountEntry->mnt_dir, &s) == 0 |
71 | && s.st_dev == devno_of_name | ||
72 | ) { | ||
63 | break; | 73 | break; |
74 | } | ||
64 | } | 75 | } |
65 | endmntent(mtab_fp); | 76 | endmntent(mtab_fp); |
66 | 77 | ||