DragonFlyBSD Kernel Audit
DF-3057 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/vfs/dirfs/dirfs_vnops.c b/sys/vfs/dirfs/dirfs_vnops.c
index a9acfbb5..58cf1696 100644
--- a/sys/vfs/dirfs/dirfs_vnops.c
+++ b/sys/vfs/dirfs/dirfs_vnops.c
@@ -738,6 +738,11 @@ dirfs_write (struct vop_write_args *ap)
 			len = uio->uio_resid;
 
 		error = bread(vp, base_offset, BSIZE, &bp);
+		if (error) {
+			brelse(bp);
+			dbg(9, "WRITE bread failed\n");
+			break;
+		}
 		error = uiomovebp(bp, (char *)bp->b_data + offset, len, uio);
 		if (error) {
 			brelse(bp);
@@ -749,10 +754,13 @@ dirfs_write (struct vop_write_args *ap)
 		dbg(9, "WRITE dn_size=%jd uio_offset=%jd uio_resid=%jd base_offset=%jd\n",
 		    dnp->dn_size, uio->uio_offset, uio->uio_resid, base_offset);
 
-		if (ap->a_ioflag & IO_SYNC)
-			bwrite(bp);
-		else
+		if (ap->a_ioflag & IO_SYNC) {
+			error = bwrite(bp);
+			if (error)
+				break;
+		} else {
 			bdwrite(bp);
+		}
 	}
 
 	KTR_LOG(dirfs_write, dnp, base_offset, uio->uio_resid,