From f7f6943a8c6dccbd085600bbb7bae4f6f6047dc4 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Tue, 19 Sep 2023 17:09:22 -0400 Subject: [PATCH] bcachefs: Fix copy_to_user() usage in flush_buf() copy_to_user() returns the number of bytes successfully copied - not an errcode. Reported-by: Dan Carpenter Signed-off-by: Kent Overstreet --- fs/bcachefs/debug.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/fs/bcachefs/debug.c b/fs/bcachefs/debug.c index 404148bd348a..75a3dc7cbd47 100644 --- a/fs/bcachefs/debug.c +++ b/fs/bcachefs/debug.c @@ -319,16 +319,16 @@ static ssize_t flush_buf(struct dump_iter *i) { if (i->buf.pos) { size_t bytes = min_t(size_t, i->buf.pos, i->size); - int err = copy_to_user(i->ubuf, i->buf.buf, bytes); + int copied = bytes - copy_to_user(i->ubuf, i->buf.buf, bytes); - if (err) - return err; + i->ret += copied; + i->ubuf += copied; + i->size -= copied; + i->buf.pos -= copied; + memmove(i->buf.buf, i->buf.buf + copied, i->buf.pos); - i->ret += bytes; - i->ubuf += bytes; - i->size -= bytes; - i->buf.pos -= bytes; - memmove(i->buf.buf, i->buf.buf + bytes, i->buf.pos); + if (copied != bytes) + return -EFAULT; } return i->size ? 0 : i->ret;