summaryrefslogtreecommitdiffstats
path: root/sys/gnu/fs
diff options
context:
space:
mode:
authordillon <dillon@FreeBSD.org>2000-12-17 23:57:05 +0000
committerdillon <dillon@FreeBSD.org>2000-12-17 23:57:05 +0000
commit69242be380386045f137192707e6c38be6c2dde4 (patch)
tree23fde77258079844ec411e103362a6eaf26bb780 /sys/gnu/fs
parent50b480af640ec7a7a0fabc8becf398da5c3e87fc (diff)
downloadFreeBSD-src-69242be380386045f137192707e6c38be6c2dde4.zip
FreeBSD-src-69242be380386045f137192707e6c38be6c2dde4.tar.gz
Avoid a data-consistency race between write() and mmap()
by ensuring that newly allocated blocks are zerod. The race can occur even in the case where the write covers the entire block. Reported by: Sven Berkvens <sven@berkvens.net>, Marc Olzheim <zlo@zlo.nu>
Diffstat (limited to 'sys/gnu/fs')
-rw-r--r--sys/gnu/fs/ext2fs/ext2_readwrite.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/gnu/fs/ext2fs/ext2_readwrite.c b/sys/gnu/fs/ext2fs/ext2_readwrite.c
index f054a6e..30a2f56 100644
--- a/sys/gnu/fs/ext2fs/ext2_readwrite.c
+++ b/sys/gnu/fs/ext2fs/ext2_readwrite.c
@@ -238,10 +238,19 @@ WRITE(ap)
if (uio->uio_offset + xfersize > ip->i_size)
vnode_pager_setsize(vp, uio->uio_offset + xfersize);
+ /*
+ * Avoid a data-consistency race between write() and mmap()
+ * by ensuring that newly allocated blocks are zerod. The
+ * race can occur even in the case where the write covers
+ * the entire block.
+ */
+ flags |= B_CLRBUF;
+#if 0
if (fs->s_frag_size > xfersize)
flags |= B_CLRBUF;
else
flags &= ~B_CLRBUF;
+#endif
error = ext2_balloc(ip,
lbn, blkoffset + xfersize, ap->a_cred, &bp, flags);
OpenPOWER on IntegriCloud