From cb413b89b8c222b900b5f52700b5499567f7cbea Mon Sep 17 00:00:00 2001 From: Yuezhang Mo Date: Thu, 17 Oct 2024 09:25:06 +0800 Subject: [PATCH] exfat: check alignment before extending ->valid_size Signed-off-by: Yuezhang Mo --- fs/exfat/file.c | 6 ++++++ fs/exfat/inode.c | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/exfat/file.c b/fs/exfat/file.c index a25d7eb789f4..a00f3f1b2cbb 100644 --- a/fs/exfat/file.c +++ b/fs/exfat/file.c @@ -584,6 +584,12 @@ static ssize_t exfat_file_write_iter(struct kiocb *iocb, struct iov_iter *iter) if (ret < 0) goto unlock; + if ((iocb->ki_flags & IOCB_DIRECT) && + EXFAT_BLK_OFFSET(pos | ret, inode->i_sb)) { + ret = -EINVAL; + goto unlock; + } + if (pos > valid_size) { ret = exfat_extend_valid_size(file, pos); if (ret < 0 && ret != -ENOSPC) { diff --git a/fs/exfat/inode.c b/fs/exfat/inode.c index d338a59c27f7..dad570e3d5ef 100644 --- a/fs/exfat/inode.c +++ b/fs/exfat/inode.c @@ -481,8 +481,10 @@ static ssize_t exfat_direct_IO(struct kiocb *iocb, struct iov_iter *iter) */ ret = blockdev_direct_IO(iocb, inode, iter, exfat_get_block); if (ret < 0) { - if (rw == WRITE && ret != -EIOCBQUEUED) + if (rw == WRITE && ret != -EIOCBQUEUED) { + pr_err("%s(): %d: ret = %zd\n", __FUNCTION__, __LINE__, ret); exfat_write_failed(mapping, size); + } return ret; } else -- 2.34.1