From: Ingo Molnar <mingo@kernel.org>
To: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Arnd Bergmann <arnd@arndb.de>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Linux List Kernel Mailing <linux-kernel@vger.kernel.org>,
syzbot <syzbot+8ab2d0f39fb79fe6ca40@syzkaller.appspotmail.com>
Subject: Re: [PATCH] /dev/mem: Bail out upon SIGKILL when reading memory.
Date: Sun, 25 Aug 2019 11:59:08 +0200 [thread overview]
Message-ID: <20190825095908.GA116866@gmail.com> (raw)
In-Reply-To: <ab9ccf3c-6b87-652e-b305-41f2c2d1b2ae@i-love.sakura.ne.jp>
* Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp> wrote:
> On 2019/08/25 5:22, Ingo Molnar wrote:
> >> So I'd be willing to try that (and then if somebody reports a
> >> regression we can make it use "fatal_signal_pending()" instead)
> >
> > Ok, will post a changelogged patch (unless Tetsuo beats me to it?).
>
> Here is a patch. This patch also tries to fix handling of return code when
> partial read/write happened (because we should return bytes processed when
> we return due to -EINTR). But asymmetric between read function and write
> function looks messy. Maybe we should just make /dev/{mem,kmem} killable
> for now, and defer making /dev/{mem,kmem} interruptible till rewrite of
> read/write functions.
>
> drivers/char/mem.c | 89 ++++++++++++++++++++++++++++++------------------------
> 1 file changed, 50 insertions(+), 39 deletions(-)
>
> diff --git a/drivers/char/mem.c b/drivers/char/mem.c
> index cb8e653..3c6a3c2 100644
> --- a/drivers/char/mem.c
> +++ b/drivers/char/mem.c
> @@ -108,7 +108,7 @@ static ssize_t read_mem(struct file *file, char __user *buf,
> ssize_t read, sz;
> void *ptr;
> char *bounce;
> - int err;
> + int err = 0;
>
> if (p != *ppos)
> return 0;
> @@ -132,8 +132,10 @@ static ssize_t read_mem(struct file *file, char __user *buf,
> #endif
>
> bounce = kmalloc(PAGE_SIZE, GFP_KERNEL);
> - if (!bounce)
> - return -ENOMEM;
> + if (!bounce) {
> + err = -ENOMEM;
> + goto failed;
> + }
Yeah, so while I agree with the more consistent handling of partial
reads, I'd suggest the following changes:
- Please don't use this 4-line error handling variant, use the old short
2-line pattern instead. There's no real reason to keep 'err' as a
flag, the 'failed' branch will know that 'err' is the error return if
there's been no progress.
- We should probably separate out a third 'fatal error' variant: for
example if copying to user-space generates a page fault, then we
clearly should not pretend that all is fine and return a short read
even if we made some progress, a -EFAULT is more informative, as we
might have corrupted (overran) some user buffer on the failed copy as
well, and ran off the end into the first unmapped user area.
- As for the patch series maybe it might make sense to separate the
fixes from the semantic changes, in case there's any breakage. I.e.
first fix the bug minimally, then add the other changes in a separate
commit. If any of them causes problems with applications we'll have a
more precise bisection result.
- Likewise, the changing of the write side interruptability of /dev/mem
should probably be a separate patch as well.
I can factor out such a series if you don't have the time, but feel free
to do it yourself, this is your bug report and your patch. :)
> @@ -180,14 +182,11 @@ static ssize_t read_mem(struct file *file, char __user *buf,
> count -= sz;
> read += sz;
> }
> +failed:
> kfree(bounce);
>
> *ppos += read;
> - return read;
> -
> -failed:
> - kfree(bounce);
> - return err;
> + return read ? read : err;
> }
Yeah, the merging of the normal and the failure path control flow doesn't
really help readability and makes the actual iterator more complex - I
think the old exception handling pattern was fine.
I think the same applies to the write path as well.
Thanks,
Ingo
next prev parent reply other threads:[~2019-08-25 9:59 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-20 22:06 [PATCH] /dev/mem: Bail out upon SIGKILL when reading memory Tetsuo Handa
2019-08-20 22:24 ` Greg Kroah-Hartman
2019-08-21 0:07 ` Tetsuo Handa
2019-08-22 9:59 ` Tetsuo Handa
2019-08-22 13:35 ` Greg Kroah-Hartman
2019-08-22 14:00 ` Tetsuo Handa
2019-08-22 16:42 ` Greg Kroah-Hartman
2019-08-22 17:11 ` Dmitry Vyukov
2019-08-22 21:17 ` Tetsuo Handa
2019-08-22 23:59 ` Dmitry Vyukov
2019-08-23 8:17 ` Tetsuo Handa
2019-08-23 16:47 ` Dmitry Vyukov
2019-10-08 9:57 ` Kernel config for fuzz testing Tetsuo Handa
2019-08-22 21:29 ` [PATCH] /dev/mem: Bail out upon SIGKILL when reading memory Linus Torvalds
2019-08-22 22:08 ` Linus Torvalds
2019-08-23 9:16 ` Ingo Molnar
2019-08-23 16:39 ` Linus Torvalds
2019-08-24 16:14 ` Ingo Molnar
2019-08-24 17:40 ` Linus Torvalds
2019-08-24 20:22 ` Ingo Molnar
2019-08-24 20:56 ` Linus Torvalds
2019-08-30 9:56 ` David Laight
2019-08-25 5:49 ` Tetsuo Handa
2019-08-25 9:59 ` Ingo Molnar [this message]
2019-08-25 10:35 ` Tetsuo Handa
2019-08-25 10:48 ` Ingo Molnar
2019-08-25 16:54 ` Linus Torvalds
2019-08-26 10:40 ` Tetsuo Handa
2019-08-26 11:19 ` Ingo Molnar
2019-08-26 15:02 ` Rewriting read_kmem()/write_kmem() ? Tetsuo Handa
2019-08-23 11:46 ` [PATCH] /dev/mem: Bail out upon SIGKILL when reading memory Tetsuo Handa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190825095908.GA116866@gmail.com \
--to=mingo@kernel.org \
--cc=arnd@arndb.de \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=penguin-kernel@i-love.sakura.ne.jp \
--cc=syzbot+8ab2d0f39fb79fe6ca40@syzkaller.appspotmail.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox