[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH] lib/vfscore: fix use of uninitialized struct vnode fields
struct vnode as it is returned by vfscore_vget is in a mostly uninitialized state. Apart from v_ino, v_mount, v_refcnt and v_op, most fields are uninitialized. This causes highly unpredictable issues with underlying filesystem implementations not initializing the remaining fields themselves. A concrete example is ramfs, which does not initialize v_flags. This causes some vnodes to have the VROOT flag set. As a consequence, sys_unlink spuriously returns EBUSY, causing SQLite to experience delays and I/O errors while performing operations on the rollback journal. Allocate struct vnode using calloc instead of malloc to make sure that all struct fields are properly initialized (this avoids v_data to be a wild reference, and correctly initializes v_type, among others). Please, note that while this prevents further issues with other uninitialized fields, calloc has an additional (minor) performance overhead over malloc. Alternatively, one can initialize v_flags to zero in ramfs_lookup (uk_9pfs_lookup is doing this). Signed-off-by: Hugo Lefeuvre <hugo.lefeuvre@xxxxxxxxx> --- lib/vfscore/vnode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/vfscore/vnode.c b/lib/vfscore/vnode.c index 51bd756..6b5ea12 100644 --- a/lib/vfscore/vnode.c +++ b/lib/vfscore/vnode.c @@ -191,7 +191,7 @@ vfscore_vget(struct mount *mp, uint64_t ino, struct vnode **vpp) return 1; } - vp = malloc(sizeof(*vp)); + vp = calloc(1, sizeof(*vp)); if (!vp) { VNODE_UNLOCK(); return 0; -- 2.24.1 Attachment:
signature.asc _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |