diff --git a/sys/fs/pseudofs/pseudofs.h b/sys/fs/pseudofs/pseudofs.h --- a/sys/fs/pseudofs/pseudofs.h +++ b/sys/fs/pseudofs/pseudofs.h @@ -219,7 +219,6 @@ * is not enforcable by WITNESS. */ struct pfs_node { - char pn_name[PFS_NAMELEN]; pfs_type_t pn_type; int pn_flags; struct mtx pn_mutex; @@ -240,6 +239,7 @@ struct pfs_node *pn_nodes; /* (o) */ struct pfs_node *pn_last_node; /* (o) */ struct pfs_node *pn_next; /* (p) */ + char pn_name[]; /* Keep it last */ }; /* diff --git a/sys/fs/pseudofs/pseudofs.c b/sys/fs/pseudofs/pseudofs.c --- a/sys/fs/pseudofs/pseudofs.c +++ b/sys/fs/pseudofs/pseudofs.c @@ -72,18 +72,20 @@ { struct pfs_node *pn; int malloc_flags; + size_t len; - KASSERT(strlen(name) < PFS_NAMELEN, + len = strlen(name); + KASSERT(len < PFS_NAMELEN, ("%s(): node name is too long", __func__)); if (flags & PFS_NOWAIT) malloc_flags = M_NOWAIT | M_ZERO; else malloc_flags = M_WAITOK | M_ZERO; - pn = malloc(sizeof *pn, M_PFSNODES, malloc_flags); + pn = malloc(sizeof(*pn) + len + 1, M_PFSNODES, malloc_flags); if (pn == NULL) return (NULL); mtx_init(&pn->pn_mutex, "pfs_node", NULL, MTX_DEF | MTX_DUPOK); - strlcpy(pn->pn_name, name, sizeof pn->pn_name); + memcpy(pn->pn_name, name, len); pn->pn_type = type; pn->pn_info = pi; return (pn);