DragonFlyBSD Kernel Audit
DF-2624 / fix.diff
← back to finding ↓ download raw
--- a/sys/vfs/hammer2/hammer2_vfsops.c
+++ b/sys/vfs/hammer2/hammer2_vfsops.c
@@ -492,7 +492,21 @@
 			pmp->pfs_types[j] = HAMMER2_PFSTYPE_MASTER;
 		else
 			pmp->pfs_types[j] = ripdata->meta.pfs_type;
-		pmp->pfs_names[j] = kstrdup((const char *)ripdata->filename, M_HAMMER2);
+		/* DF-2624: the on-disk filename array is not guaranteed
+		 * to be NUL-terminated; bound the copy. */
+		{
+			size_t nlen = strnlen((const char *)ripdata->filename,
+					      HAMMER2_INODE_MAXNAME);
+
+			pmp->pfs_names[j] = kmalloc(nlen + 1, M_HAMMER2,
+						    M_WAITOK | M_ZERO);
+			bcopy(ripdata->filename, pmp->pfs_names[j], nlen);
+			if (nlen == HAMMER2_INODE_MAXNAME) {
+				kprintf("hammer2_pfsalloc: PFS filename not "
+					"NUL-terminated (truncated to %d)\n",
+					(int)nlen);
+			}
+		}
 		pmp->pfs_hmps[j] = chain->hmp;
 		hammer2_spin_ex(&pmp->blockset_spin);
 		pmp->pfs_iroot_blocksets[j] = chain->data->ipdata.u.blockset;