diff options
author | trasz <trasz@FreeBSD.org> | 2015-06-18 21:55:55 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2015-06-18 21:55:55 +0000 |
commit | 19250d4f16f66aaad903ed821f23db1b699eeb83 (patch) | |
tree | 4066f81eaf35cc353c8f3611fe6de9b0fd9df77f /sys/geom | |
parent | 37e1f5956c5d18fa0bb179ce4913b67eec397465 (diff) | |
download | FreeBSD-src-19250d4f16f66aaad903ed821f23db1b699eeb83.zip FreeBSD-src-19250d4f16f66aaad903ed821f23db1b699eeb83.tar.gz |
Fix off-by-one error in fstyp(8) and geom_label(4) that made them use
a single space (" ") as a CD9660 label name when no label was present.
Similar problem was also present in msdosfs label recognition.
PR: 200828
Differential Revision: https://reviews.freebsd.org/D2830
Reviewed by: asomers@, emaste@
MFC after: 2 weeks
Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'sys/geom')
-rw-r--r-- | sys/geom/label/g_label.c | 15 | ||||
-rw-r--r-- | sys/geom/label/g_label.h | 2 | ||||
-rw-r--r-- | sys/geom/label/g_label_iso9660.c | 10 | ||||
-rw-r--r-- | sys/geom/label/g_label_msdosfs.c | 10 |
4 files changed, 19 insertions, 18 deletions
diff --git a/sys/geom/label/g_label.c b/sys/geom/label/g_label.c index 36498e1..b4a1365 100644 --- a/sys/geom/label/g_label.c +++ b/sys/geom/label/g_label.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include <sys/malloc.h> #include <sys/libkern.h> #include <sys/sbuf.h> +#include <sys/stddef.h> #include <sys/sysctl.h> #include <geom/geom.h> #include <geom/geom_slice.h> @@ -96,6 +97,20 @@ const struct g_label_desc *g_labels[] = { NULL }; +void +g_label_rtrim(char *label, size_t size) +{ + ptrdiff_t i; + + for (i = size - 1; i >= 0; i--) { + if (label[i] == '\0') + continue; + else if (label[i] == ' ') + label[i] = '\0'; + else + break; + } +} static int g_label_destroy_geom(struct gctl_req *req __unused, struct g_class *mp, diff --git a/sys/geom/label/g_label.h b/sys/geom/label/g_label.h index 66b762c..9092d98 100644 --- a/sys/geom/label/g_label.h +++ b/sys/geom/label/g_label.h @@ -86,6 +86,8 @@ extern struct g_label_desc g_label_ntfs; extern struct g_label_desc g_label_gpt; extern struct g_label_desc g_label_gpt_uuid; extern struct g_label_desc g_label_disk_ident; + +extern void g_label_rtrim(char *label, size_t size); #endif /* _KERNEL */ struct g_label_metadata { diff --git a/sys/geom/label/g_label_iso9660.c b/sys/geom/label/g_label_iso9660.c index 154cefc..c3c49b0 100644 --- a/sys/geom/label/g_label_iso9660.c +++ b/sys/geom/label/g_label_iso9660.c @@ -47,7 +47,6 @@ g_label_iso9660_taste(struct g_consumer *cp, char *label, size_t size) { struct g_provider *pp; char *sector, *volume; - int i; g_topology_assert_not(); pp = cp->provider; @@ -68,14 +67,7 @@ g_label_iso9660_taste(struct g_consumer *cp, char *label, size_t size) bzero(label, size); strlcpy(label, volume, MIN(size, VOLUME_LEN)); g_free(sector); - for (i = size - 1; i > 0; i--) { - if (label[i] == '\0') - continue; - else if (label[i] == ' ') - label[i] = '\0'; - else - break; - } + g_label_rtrim(label, size); } struct g_label_desc g_label_iso9660 = { diff --git a/sys/geom/label/g_label_msdosfs.c b/sys/geom/label/g_label_msdosfs.c index 5f65a72..918fabc 100644 --- a/sys/geom/label/g_label_msdosfs.c +++ b/sys/geom/label/g_label_msdosfs.c @@ -48,7 +48,6 @@ g_label_msdosfs_taste(struct g_consumer *cp, char *label, size_t size) FAT32_BSBPB *pfat32_bsbpb; FAT_DES *pfat_entry; uint8_t *sector0, *sector; - uint32_t i; g_topology_assert_not(); pp = cp->provider; @@ -200,14 +199,7 @@ g_label_msdosfs_taste(struct g_consumer *cp, char *label, size_t size) } endofchecks: - for (i = size - 1; i > 0; i--) { - if (label[i] == '\0') - continue; - else if (label[i] == ' ') - label[i] = '\0'; - else - break; - } + g_label_rtrim(label, size); error: if (sector0 != NULL) |