Module Name: src Committed By: dholland Date: Mon Jul 18 01:13:33 UTC 2011
Modified Files: src/sys/ufs/ufs: ufs_vnops.c Log Message: Fix error path for UFS_WAPBL_BEGIN failure to avoid leaking an vnode (in memory) and inode (on disk). Caution: untested; I have no idea how to provoke such a failure. To generate a diff of this commit: cvs rdiff -u -r1.195 -r1.196 src/sys/ufs/ufs/ufs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/ufs/ufs/ufs_vnops.c diff -u src/sys/ufs/ufs/ufs_vnops.c:1.195 src/sys/ufs/ufs/ufs_vnops.c:1.196 --- src/sys/ufs/ufs/ufs_vnops.c:1.195 Sun Jul 17 22:02:26 2011 +++ src/sys/ufs/ufs/ufs_vnops.c Mon Jul 18 01:13:33 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_vnops.c,v 1.195 2011/07/17 22:02:26 dholland Exp $ */ +/* $NetBSD: ufs_vnops.c,v 1.196 2011/07/18 01:13:33 dholland Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.195 2011/07/17 22:02:26 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.196 2011/07/18 01:13:33 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -1412,11 +1412,16 @@ */ if ((error = UFS_VALLOC(dvp, dmode, cnp->cn_cred, ap->a_vpp)) != 0) goto out; - error = UFS_WAPBL_BEGIN(ap->a_dvp->v_mount); - if (error) - goto out; + tvp = *ap->a_vpp; ip = VTOI(tvp); + + error = UFS_WAPBL_BEGIN(ap->a_dvp->v_mount); + if (error) { + UFS_VFREE(tvp, ip->i_number, dmode); + vput(tvp); + goto out; + } ip->i_uid = kauth_cred_geteuid(cnp->cn_cred); DIP_ASSIGN(ip, uid, ip->i_uid); ip->i_gid = dp->i_gid;