diff --git a/src/cryptsetup/cryptsetup.c b/src/cryptsetup/cryptsetup.c index 2df7633dac7..65e328389dc 100644 --- a/src/cryptsetup/cryptsetup.c +++ b/src/cryptsetup/cryptsetup.c @@ -419,7 +419,6 @@ static int parse_options(const char *options) { static char* disk_description(const char *path) { static const char name_fields[] = - "ID_PART_ENTRY_NAME\0" "DM_NAME\0" "ID_MODEL_FROM_DATABASE\0" "ID_MODEL\0"; @@ -427,6 +426,7 @@ static char* disk_description(const char *path) { _cleanup_(sd_device_unrefp) sd_device *device = NULL; const char *i, *name; struct stat st; + int r; assert(path); @@ -436,9 +436,27 @@ static char* disk_description(const char *path) { if (!S_ISBLK(st.st_mode)) return NULL; - if (sd_device_new_from_devnum(&device, 'b', st.st_rdev) < 0) + if (sd_device_new_from_stat_rdev(&device, &st) < 0) return NULL; + if (sd_device_get_property_value(device, "ID_PART_ENTRY_NAME", &name) >= 0) { + _cleanup_free_ char *unescaped = NULL; + + /* ID_PART_ENTRY_NAME uses \x style escaping, using libblkid's blkid_encode_string(). Let's + * reverse this here to make the string more human friendly in case people embed spaces or + * other weird stuff. */ + + r = cunescape(name, UNESCAPE_RELAX, &unescaped); + if (r < 0) { + log_debug_errno(r, "Failed to unescape ID_PART_ENTRY_NAME, skipping device: %m"); + return NULL; + } + + if (!isempty(unescaped) && !string_has_cc(unescaped, NULL)) + return TAKE_PTR(unescaped); + } + + /* These need no unescaping. */ NULSTR_FOREACH(i, name_fields) if (sd_device_get_property_value(device, i, &name) >= 0 && !isempty(name)) diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c index 584d441c942..cd7adfaeb96 100644 --- a/src/fsck/fsck.c +++ b/src/fsck/fsck.c @@ -287,7 +287,7 @@ static int run(int argc, char *argv[]) { "%s is not a block device.", device); - r = sd_device_new_from_devnum(&dev, 'b', st.st_rdev); + r = sd_device_new_from_stat_rdev(&dev, &st); if (r < 0) return log_error_errno(r, "Failed to detect device %s: %m", device); diff --git a/src/home/homed-home.c b/src/home/homed-home.c index 2ea0f7c81d9..f1db828ed0e 100644 --- a/src/home/homed-home.c +++ b/src/home/homed-home.c @@ -2711,7 +2711,7 @@ static int home_get_image_path_seat(Home *h, char **ret) { if (!S_ISBLK(st.st_mode)) return -ENOTBLK; - r = sd_device_new_from_devnum(&d, 'b', st.st_rdev); + r = sd_device_new_from_stat_rdev(&d, &st); if (r < 0) return r; diff --git a/src/mount/mount-tool.c b/src/mount/mount-tool.c index 153f67f93b3..4a8f46761a6 100644 --- a/src/mount/mount-tool.c +++ b/src/mount/mount-tool.c @@ -929,7 +929,7 @@ static int umount_by_device(sd_bus *bus, const char *what) { return log_error_errno(SYNTHETIC_ERRNO(ENOTBLK), "Not a block device: %s", what); - r = sd_device_new_from_devnum(&d, 'b', st.st_rdev); + r = sd_device_new_from_stat_rdev(&d, &st); if (r < 0) return log_error_errno(r, "Failed to get device from device number: %m"); @@ -1270,7 +1270,7 @@ static int discover_loop_backing_file(void) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid file type: %s", loop_dev); - r = sd_device_new_from_devnum(&d, 'b', st.st_rdev); + r = sd_device_new_from_stat_rdev(&d, &st); if (r < 0) return log_error_errno(r, "Failed to get device from device number: %m"); @@ -1314,7 +1314,7 @@ static int discover_device(void) { "Invalid file type: %s", arg_mount_what); - r = sd_device_new_from_devnum(&d, 'b', st.st_rdev); + r = sd_device_new_from_stat_rdev(&d, &st); if (r < 0) return log_error_errno(r, "Failed to get device from device number: %m"); diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index 8de17382645..791d747136e 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -532,7 +532,7 @@ int dissect_image( if (!S_ISBLK(st.st_mode)) return -ENOTBLK; - r = sd_device_new_from_devnum(&d, 'b', st.st_rdev); + r = sd_device_new_from_stat_rdev(&d, &st); if (r < 0) return r; diff --git a/src/shared/udev-util.c b/src/shared/udev-util.c index 80b70c18a03..9d732dca2cd 100644 --- a/src/shared/udev-util.c +++ b/src/shared/udev-util.c @@ -136,7 +136,7 @@ static int device_new_from_dev_path(const char *devlink, sd_device **ret_device) return log_error_errno(SYNTHETIC_ERRNO(ENOTBLK), "%s does not point to a block device: %m", devlink); - r = sd_device_new_from_devnum(ret_device, 'b', st.st_rdev); + r = sd_device_new_from_stat_rdev(ret_device, &st); if (r < 0) return log_error_errno(r, "Failed to initialize device from %s: %m", devlink);