DF-0780 / fix.diff
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; |