From 8f1998b8d3a5bfe61ee4d6d6aa6bb2efb94074c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 16 Sep 2023 19:15:05 +0200 Subject: [PATCH] basic/path-util: do not say that /dev and /sys are device paths "/dev" or "/dev/" is the mount point, not a device path. In particular, 'systemctl status /dev' clearly does not refer to a device, so let's tweak the code a bit to say that those are not device paths. (Treating "/../dev" same as "/dev" would be also be reasonable, but that requires chase(), which requires disk access, which we don't want to do from this lightweight function.) --- src/basic/path-util.c | 11 +++++++++-- src/test/test-path-util.c | 28 ++++++++++++++-------------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/basic/path-util.c b/src/basic/path-util.c index 7204c80e793..beec70ad777 100644 --- a/src/basic/path-util.c +++ b/src/basic/path-util.c @@ -1272,9 +1272,16 @@ bool hidden_or_backup_file(const char *filename) { bool is_device_path(const char *path) { /* Returns true for paths that likely refer to a device, either by path in sysfs or to something in - * /dev. */ + * /dev. This accepts any path that starts with /dev/ or /sys/ and has something after that prefix. + * It does not actually resolve the path. + * + * Examples: + * /dev/sda, /dev/sda/foo, /sys/class, /dev/.., /sys/.., /./dev/foo → yes. + * /../dev/sda, /dev, /sys, /usr/path, /usr/../dev/sda → no. + */ - return PATH_STARTSWITH_SET(path, "/dev/", "/sys/"); + const char *p = PATH_STARTSWITH_SET(ASSERT_PTR(path), "/dev/", "/sys/"); + return !isempty(p); } bool valid_device_node_path(const char *path) { diff --git a/src/test/test-path-util.c b/src/test/test-path-util.c index c6a746b441d..e8d6ff39e81 100644 --- a/src/test/test-path-util.c +++ b/src/test/test-path-util.c @@ -99,18 +99,18 @@ TEST(is_device_path) { assert_se(!is_device_path("")); assert_se(!is_device_path("..")); - assert_se( is_device_path("/dev")); - assert_se( is_device_path("/./dev")); - assert_se( is_device_path("/./dev/.")); + assert_se(!is_device_path("/dev")); + assert_se(!is_device_path("/./dev")); + assert_se(!is_device_path("/./dev/.")); assert_se(!is_device_path("/./dev.")); assert_se( is_device_path("/./dev/foo")); assert_se( is_device_path("/./dev/./foo")); assert_se(!is_device_path("/./dev./foo")); - assert_se( is_device_path("//dev")); - assert_se( is_device_path("///dev")); - assert_se( is_device_path("/dev/")); - assert_se( is_device_path("///dev/")); - assert_se( is_device_path("/./dev/")); + assert_se(!is_device_path("//dev")); + assert_se(!is_device_path("///dev")); + assert_se(!is_device_path("/dev/")); + assert_se(!is_device_path("///dev/")); + assert_se(!is_device_path("/./dev/")); assert_se(!is_device_path("/../dev/")); assert_se( is_device_path("/dev/sda")); assert_se( is_device_path("/dev/sda5")); @@ -120,10 +120,10 @@ TEST(is_device_path) { assert_se(!is_device_path("/../../dev/sda5")); assert_se(!is_device_path("/../../../dev/sda5b3")); assert_se(!is_device_path("/.././.././dev/sda5b3/idontexit")); - assert_se( is_device_path("/sys")); - assert_se( is_device_path("/sys/")); - assert_se( is_device_path("/./sys")); - assert_se( is_device_path("/./sys/.")); + assert_se(!is_device_path("/sys")); + assert_se(!is_device_path("/sys/")); + assert_se(!is_device_path("/./sys")); + assert_se(!is_device_path("/./sys/.")); assert_se(!is_device_path("/./sys.")); assert_se( is_device_path("/./sys/foo")); assert_se( is_device_path("/./sys/./foo")); @@ -131,8 +131,8 @@ TEST(is_device_path) { assert_se( is_device_path("/sys/what")); assert_se( is_device_path("/sys/something/..")); assert_se( is_device_path("/sys/something/../")); - assert_se( is_device_path("/sys////")); - assert_se( is_device_path("/sys////.")); + assert_se(!is_device_path("/sys////")); + assert_se(!is_device_path("/sys////.")); assert_se( is_device_path("/sys/..")); assert_se( is_device_path("/sys/../")); assert_se(!is_device_path("/usr/../dev/sda"));