From: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
To: Haren Myneni <haren@linux.ibm.com>, linuxppc-dev@lists.ozlabs.org
Cc: maddy@linux.ibm.com, brauner@kernel.org, hbabu@us.ibm.com,
haren@linux.ibm.com
Subject: Re: [PATCH] powerpc/pseries: Fix UAF reference for src_info after list_add
Date: Tue, 07 Apr 2026 15:48:04 +0530 [thread overview]
Message-ID: <v7e3krab.ritesh.list@gmail.com> (raw)
In-Reply-To: <20260317040444.2785741-1-haren@linux.ibm.com>
Haren Myneni <haren@linux.ibm.com> writes:
> Getting the following kernel panic in papr_hvpipe_dev_create_handle()
> when trying to add src_info to the list.
> Kernel attempted to write user page (0) - exploit attempt? (uid: 0)
> BUG: Kernel NULL pointer dereference on write at 0x00000000
> Faulting instruction address: 0xc0000000001b44a0
> Oops: Kernel access of bad area, sig: 11 [#1]
> ...
> Call Trace:
> papr_hvpipe_dev_ioctl+0x1f4/0x48c (unreliable)
> sys_ioctl+0x528/0x1064
> system_call_exception+0x128/0x360
> system_call_vectored_common+0x15c/0x2ec
>
> The current code adds src_info to the list after UAF for src_info.
> So move the retain_and_null_ptr(src_info) after this list add.
>
Sorry for the delay in getting back on this.
> Fixes: 6d3789d347a7 ("papr-hvpipe: convert papr_hvpipe_dev_create_handle() to FD_PREPARE()")
> Signed-off-by: Haren Myneni <haren@linux.ibm.com>
> ---
> arch/powerpc/platforms/pseries/papr-hvpipe.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/powerpc/platforms/pseries/papr-hvpipe.c b/arch/powerpc/platforms/pseries/papr-hvpipe.c
> index 14ae480d060a..5121c87d1fad 100644
> --- a/arch/powerpc/platforms/pseries/papr-hvpipe.c
> +++ b/arch/powerpc/platforms/pseries/papr-hvpipe.c
> @@ -509,7 +509,6 @@ static int papr_hvpipe_dev_create_handle(u32 srcID)
> if (fdf.err)
> return fdf.err;
>
> - retain_and_null_ptr(src_info);
> spin_lock(&hvpipe_src_list_lock);
> /*
> * If two processes are executing ioctl() for the same
> @@ -522,6 +521,7 @@ static int papr_hvpipe_dev_create_handle(u32 srcID)
> }
> list_add(&src_info->list, &hvpipe_src_list);
> spin_unlock(&hvpipe_src_list_lock);
> + retain_and_null_ptr(src_info);
> return fd_publish(fdf);
> }
Looking at the destructor routine...
static inline void class_fd_prepare_destructor(const struct fd_prepare *fdf)
{
if (unlikely(fdf->__fd >= 0))
put_unused_fd(fdf->__fd);
if (unlikely(!IS_ERR_OR_NULL(fdf->__file)))
fput(fdf->__file);
}
...I think this approach might still have issues. i.e. if we don't make
src_info as null like how it was done before, then when we return an
error from here, it can cause double free issue:
if (hvpipe_find_source(srcID)) {
spin_unlock(&hvpipe_src_list_lock);
return -EALREADY;
}
Because, an auto cleanup / kfree(src_info) will get called. And since
the FD_PREPARE() step was done successfully, it will also call the
file->f_op()->release() function on fput(). Now since we have not even
added the src_info into the global list so this can cause list
corruption as well.
static int papr_hvpipe_handle_release(struct inode *inode,
struct file *file)
...
src_info = file->private_data;
list_del(&src_info->list);
...
So looks like, this approach has list corruption + double free issue.
Maybe you can even try to reproduce this when you call the IOCTL twice
with the same srcID.
@Haren,
While looking at the papr-hvpipe code, I think I may have found couple
of more issues. So, I am preparing a set of fixes for the same. I will
need your help in the review and testing of those please, as I am not
much familiar with this code :)
-ritesh
prev parent reply other threads:[~2026-04-07 11:29 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-17 4:04 [PATCH] powerpc/pseries: Fix UAF reference for src_info after list_add Haren Myneni
2026-04-07 10:18 ` Ritesh Harjani [this message]
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=v7e3krab.ritesh.list@gmail.com \
--to=ritesh.list@gmail.com \
--cc=brauner@kernel.org \
--cc=haren@linux.ibm.com \
--cc=hbabu@us.ibm.com \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=maddy@linux.ibm.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.