aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2019-04-29 17:59:08 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2019-04-29 17:59:08 +0200
commitf3a064f4956e113978e74486300dcd1e3e044efa (patch)
tree1a122c33fd15dce4563cd70e3c3e2c852578986b
parentfa8878bf1fe331df752395cce90da212e25e07b7 (diff)
downloadbusybox-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.c15
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