On Tue, Aug 01, 2023 at 06:34:26PM +0200, David Hildenbrand wrote:
On 01.08.23 18:33, Lorenzo Stoakes wrote:
On Tue, Aug 01, 2023 at 11:05:40AM +0200, David Hildenbrand wrote:
On 31.07.23 23:50, Lorenzo Stoakes wrote:
Some architectures do not populate the entire range categorised by KCORE_TEXT, so we must ensure that the kernel address we read from is valid.
Unfortunately there is no solution currently available to do so with a purely iterator solution so reinstate the bounce buffer in this instance so we can use copy_from_kernel_nofault() in order to avoid page faults when regions are unmapped.
This change partly reverts commit 2e1c0170771e ("fs/proc/kcore: avoid bounce buffer for ktext data"), reinstating the bounce buffer, but adapts the code to continue to use an iterator.
Fixes: 2e1c0170771e ("fs/proc/kcore: avoid bounce buffer for ktext data") Reported-by: Jiri Olsa olsajiri@gmail.com Closes: https://lore.kernel.org/all/ZHc2fm+9daF6cgCE@krava Cc: stable@vger.kernel.org Signed-off-by: Lorenzo Stoakes lstoakes@gmail.com
fs/proc/kcore.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c index 9cb32e1a78a0..3bc689038232 100644 --- a/fs/proc/kcore.c +++ b/fs/proc/kcore.c @@ -309,6 +309,8 @@ static void append_kcore_note(char *notes, size_t *i, const char *name, static ssize_t read_kcore_iter(struct kiocb *iocb, struct iov_iter *iter) {
- struct file *file = iocb->ki_filp;
- char *buf = file->private_data; loff_t *fpos = &iocb->ki_pos; size_t phdrs_offset, notes_offset, data_offset; size_t page_offline_frozen = 1;
@@ -554,11 +556,22 @@ static ssize_t read_kcore_iter(struct kiocb *iocb, struct iov_iter *iter) fallthrough; case KCORE_VMEMMAP: case KCORE_TEXT:
/*
* Sadly we must use a bounce buffer here to be able to
* make use of copy_from_kernel_nofault(), as these
* memory regions might not always be mapped on all
* architectures.
*/
if (copy_from_kernel_nofault(buf, (void *)start, tsz)) {
if (iov_iter_zero(tsz, iter) != tsz) {
ret = -EFAULT;
goto out;
} /* * We use _copy_to_iter() to bypass usermode hardening * which would otherwise prevent this operation. */
Having a comment at this indentation level looks for the else case looks kind of weird.
Yeah, but having it indented again would be weird and seem like it doesn't apply to the block below, there's really no good spot for it and checkpatch.pl doesn't mind so I think this is ok :)
(does that comment still apply?)
Hm good point, actually, now we're using the bounce buffer we don't need to avoid usermode hardening any more.
However since we've established a bounce buffer ourselves its still appropriate to use _copy_to_iter() as we know the source region is good to copy from.
To make life easy I'll just respin with an updated comment :)
I'm not too picky this time, no need to resend if everybody else is fine :P
Haha you know the classic Lorenzo respin spiral and want to avoid it I see ;)
The comment is actually inaccurate now, so to avoid noise + make life easy (maybe) for Andrew here's a fix patch that just corrects the comment:-
----8<----
From d2b8fb271f21b79048e5630699133f77a93d0481 Mon Sep 17 00:00:00 2001 From: Lorenzo Stoakes lstoakes@gmail.com Date: Tue, 1 Aug 2023 17:36:08 +0100 Subject: [PATCH] fs/proc/kcore: correct comment
Correct comment to be strictly correct about reasoning.
Signed-off-by: Lorenzo Stoakes lstoakes@gmail.com --- fs/proc/kcore.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c index 3bc689038232..23fc24d16b31 100644 --- a/fs/proc/kcore.c +++ b/fs/proc/kcore.c @@ -568,8 +568,8 @@ static ssize_t read_kcore_iter(struct kiocb *iocb, struct iov_iter *iter) goto out; } /* - * We use _copy_to_iter() to bypass usermode hardening - * which would otherwise prevent this operation. + * We know the bounce buffer is safe to copy from, so + * use _copy_to_iter() directly. */ } else if (_copy_to_iter(buf, tsz, iter) != tsz) { ret = -EFAULT; -- 2.41.0