Skip to content

Commit e9075e4

Browse files
deepanshu406brauner
authored andcommitted
netfs: Fix NULL pointer dereference in netfs_unbuffered_write() on retry
When a write subrequest is marked NETFS_SREQ_NEED_RETRY, the retry path in netfs_unbuffered_write() unconditionally calls stream->prepare_write() without checking if it is NULL. Filesystems such as 9P do not set the prepare_write operation, so stream->prepare_write remains NULL. When get_user_pages() fails with -EFAULT and the subrequest is flagged for retry, this results in a NULL pointer dereference at fs/netfs/direct_write.c:189. Fix this by mirroring the pattern already used in write_retry.c: if stream->prepare_write is NULL, skip renegotiation and directly reissue the subrequest via netfs_reissue_write(), which handles iterator reset, IN_PROGRESS flag, stats update and reissue internally. Fixes: a0b4c7a ("netfs: Fix unbuffered/DIO writes to dispatch subrequests in strict sequence") Reported-by: syzbot+7227db0fbac9f348dba0@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=7227db0fbac9f348dba0 Signed-off-by: Deepanshu Kartikey <Kartikey406@gmail.com> Link: https://patch.msgid.link/20260307043947.347092-1-kartikey406@gmail.com Tested-by: syzbot+7227db0fbac9f348dba0@syzkaller.appspotmail.com Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent 67e467a commit e9075e4

1 file changed

Lines changed: 11 additions & 3 deletions

File tree

fs/netfs/direct_write.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,18 @@ static int netfs_unbuffered_write(struct netfs_io_request *wreq)
186186
stream->sreq_max_segs = INT_MAX;
187187

188188
netfs_get_subrequest(subreq, netfs_sreq_trace_get_resubmit);
189-
stream->prepare_write(subreq);
190189

191-
__set_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags);
192-
netfs_stat(&netfs_n_wh_retry_write_subreq);
190+
if (stream->prepare_write) {
191+
stream->prepare_write(subreq);
192+
__set_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags);
193+
netfs_stat(&netfs_n_wh_retry_write_subreq);
194+
} else {
195+
struct iov_iter source;
196+
197+
netfs_reset_iter(subreq);
198+
source = subreq->io_iter;
199+
netfs_reissue_write(stream, subreq, &source);
200+
}
193201
}
194202

195203
netfs_unbuffered_write_done(wreq);

0 commit comments

Comments
 (0)