DragonFlyBSD Kernel Audit
DF-0780 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/vfs/fuse/fuse_vnops.c b/sys/vfs/fuse/fuse_vnops.c
--- a/sys/vfs/fuse/fuse_vnops.c
+++ b/sys/vfs/fuse/fuse_vnops.c
@@ -2051,11 +2051,23 @@
 		error = fuse_ipc_tx(fip);
 
 		if (error == 0) {
-			memcpy(bp->b_data, fuse_out_data(fip),
-			       fuse_out_data_size(fip));
-			fuse_ipc_put(fip);
-			bp->b_resid = 0;
-			bp->b_error = 0;
+			size_t olen = fuse_out_data_size(fip);
+			if (olen > bp->b_bcount) {
+				/*
+				 * DF-0780: a malicious/buggy daemon may return more
+				 * bytes than the requested read size.  Refuse the
+				 * copy instead of overflowing bp->b_data.
+				 */
+				fuse_ipc_put(fip);
+				bp->b_resid = bp->b_bcount;
+				bp->b_flags |= B_ERROR | B_INVAL;
+				bp->b_error = EINVAL;
+			} else {
+				memcpy(bp->b_data, fuse_out_data(fip), olen);
+				fuse_ipc_put(fip);
+				bp->b_resid = 0;
+				bp->b_error = 0;
+			}
 		} else {
 			bp->b_resid = bp->b_bcount;
 			bp->b_flags |= B_ERROR | B_INVAL;