git: 6b7b8575e979 - main - mfiutil: Use sbuf(3) to construct drive names in mfi_drive_name
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 07 Jul 2025 17:23:02 UTC
The branch main has been updated by jhb:
URL: https://cgit.FreeBSD.org/src/commit/?id=6b7b8575e97980166416886935e8cf376e50d88d
commit 6b7b8575e97980166416886935e8cf376e50d88d
Author: John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2025-07-07 16:37:28 +0000
Commit: John Baldwin <jhb@FreeBSD.org>
CommitDate: 2025-07-07 16:37:28 +0000
mfiutil: Use sbuf(3) to construct drive names in mfi_drive_name
This replaces fragile uses of snprintf(). Note that I did not keep
the truncation check for the space separator in the middle of the
drive name since the same check was not applied to the second part, so
the name was truncated anyway. Just truncate the entire result if it
doesn't fit.
Differential Revision: https://reviews.freebsd.org/D50883
---
usr.sbin/mfiutil/Makefile | 2 +-
usr.sbin/mfiutil/mfi_drive.c | 34 ++++++++++++----------------------
2 files changed, 13 insertions(+), 23 deletions(-)
diff --git a/usr.sbin/mfiutil/Makefile b/usr.sbin/mfiutil/Makefile
index da1c9249f8cd..85b66d4b6f49 100644
--- a/usr.sbin/mfiutil/Makefile
+++ b/usr.sbin/mfiutil/Makefile
@@ -9,7 +9,7 @@ MLINKS= mfiutil.8 mrsasutil.8
CFLAGS.gcc+= -fno-builtin-strftime
-LIBADD= util
+LIBADD= sbuf util
# Here be dragons
.ifdef DEBUG
diff --git a/usr.sbin/mfiutil/mfi_drive.c b/usr.sbin/mfiutil/mfi_drive.c
index e8e945c566c4..c7c5aeb02f14 100644
--- a/usr.sbin/mfiutil/mfi_drive.c
+++ b/usr.sbin/mfiutil/mfi_drive.c
@@ -31,6 +31,7 @@
#include <sys/types.h>
#include <sys/errno.h>
+#include <sys/sbuf.h>
#include <ctype.h>
#include <err.h>
#include <fcntl.h>
@@ -56,9 +57,9 @@ const char *
mfi_drive_name(struct mfi_pd_info *pinfo, uint16_t device_id, uint32_t def)
{
struct mfi_pd_info info;
+ struct sbuf sb;
static char buf[16];
- char *p;
- int error, fd, len;
+ int fd;
if ((def & MFI_DNAME_HONOR_OPTS) != 0 &&
(mfi_opts & (MFI_DNAME_ES|MFI_DNAME_DEVICE_ID)) != 0)
@@ -89,40 +90,29 @@ mfi_drive_name(struct mfi_pd_info *pinfo, uint16_t device_id, uint32_t def)
pinfo = &info;
}
- p = buf;
- len = sizeof(buf);
+ sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN);
if (def & MFI_DNAME_DEVICE_ID) {
if (device_id == 0xffff)
- error = snprintf(p, len, "MISSING");
+ sbuf_printf(&sb, "MISSING");
else
- error = snprintf(p, len, "%2u", device_id);
- if (error >= 0) {
- p += error;
- len -= error;
- }
+ sbuf_printf(&sb, "%2u", device_id);
}
if ((def & (MFI_DNAME_ES|MFI_DNAME_DEVICE_ID)) ==
- (MFI_DNAME_ES|MFI_DNAME_DEVICE_ID) && len >= 2) {
- *p++ = ' ';
- len--;
- *p = '\0';
- len--;
+ (MFI_DNAME_ES|MFI_DNAME_DEVICE_ID)) {
+ sbuf_cat(&sb, " ");
}
if (def & MFI_DNAME_ES) {
if (pinfo->encl_device_id == 0xffff)
- error = snprintf(p, len, "S%u",
+ sbuf_printf(&sb, "S%u",
pinfo->slot_number);
else if (pinfo->encl_device_id == pinfo->ref.v.device_id)
- error = snprintf(p, len, "E%u",
+ sbuf_printf(&sb, "E%u",
pinfo->encl_index);
else
- error = snprintf(p, len, "E%u:S%u",
+ sbuf_printf(&sb, "E%u:S%u",
pinfo->encl_index, pinfo->slot_number);
- if (error >= 0) {
- p += error;
- len -= error;
- }
}
+ sbuf_finish(&sb);
return (buf);
}