DragonFlyBSD Kernel Audit
DF-1882 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/disk/nata/ata-disk.c b/sys/dev/disk/nata/ata-disk.c
--- a/sys/dev/disk/nata/ata-disk.c
+++ b/sys/dev/disk/nata/ata-disk.c
@@ -508,8 +508,21 @@
     u_int8_t *marker, vendor[64], product[64];
 
     /* try to seperate the ATA model string into vendor and model parts */
-    if ((marker = index(atadev->param.model, ' ')) ||
-	(marker = index(atadev->param.model, '-'))) {
+    /* param.model is a u_int8_t[40] NOT guaranteed NUL-terminated by
+     * IDENTIFY; index() would scan past the end.  Walk explicitly. */
+    marker = NULL;
+    {
+	size_t ml;
+	for (ml = 0; ml < 40; ml++) {
+	    if (atadev->param.model[ml] == ' ' || atadev->param.model[ml] == '-') {
+		marker = &atadev->param.model[ml];
+		break;
+	    }
+	    if (atadev->param.model[ml] == '\0')
+		break;
+	}
+    }
+    if (marker) {
 	int len = (marker - atadev->param.model);
 
 	strncpy(vendor, atadev->param.model, len);