summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorart <art@openbsd.org>2001-03-21 10:11:22 +0000
committerart <art@openbsd.org>2001-03-21 10:11:22 +0000
commitb639cd3a9a97bd8740d86cf77299628aeceda24b (patch)
tree4bf3542d95ebfc13d57227e7442a1d9b0e51a855
parentdangling space in comment (diff)
downloadwireguard-openbsd-b639cd3a9a97bd8740d86cf77299628aeceda24b.tar.xz
wireguard-openbsd-b639cd3a9a97bd8740d86cf77299628aeceda24b.zip
Fix a race which could cause us to write out data belonging
to some other buffer.
-rw-r--r--sys/kern/vfs_cluster.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/kern/vfs_cluster.c b/sys/kern/vfs_cluster.c
index 4da9e7d6ae1..df7b6b39b68 100644
--- a/sys/kern/vfs_cluster.c
+++ b/sys/kern/vfs_cluster.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfs_cluster.c,v 1.21 2001/02/27 14:55:34 csapuntz Exp $ */
+/* $OpenBSD: vfs_cluster.c,v 1.22 2001/03/21 10:11:22 art Exp $ */
/* $NetBSD: vfs_cluster.c,v 1.12 1996/04/22 01:39:05 christos Exp $ */
/*-
@@ -625,7 +625,15 @@ redo:
bawrite(last_bp);
} else if (len) {
bp = getblk(vp, start_lbn, size, 0, 0);
- bawrite(bp);
+ /*
+ * The buffer could have already been flushed out of
+ * the cache. If that has happened, we'll get a new
+ * buffer here with random data, just drop it.
+ */
+ if ((bp->b_flags & B_DELWRI) == 0)
+ brelse(bp);
+ else
+ bawrite(bp);
}
return;
}