From: David Gibson <david@gibson.dropbear.id.au>
To: Daniel Henrique Barboza <danielhb413@gmail.com>
Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org, clg@kaod.org
Subject: Re: [PATCH for-7.1 1/1] hw/ppc: check if spapr_drc_index() returns NULL in spapr_nvdimm.c
Date: Wed, 6 Apr 2022 13:03:43 +1000 [thread overview]
Message-ID: <Yk0DD+B7MmRtcILR@yekko> (raw)
In-Reply-To: <20220405203416.75952-2-danielhb413@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 3005 bytes --]
On Tue, Apr 05, 2022 at 05:34:16PM -0300, Daniel Henrique Barboza wrote:
> spapr_nvdimm_flush_completion_cb() and flush_worker_cb() are using the
> DRC object returned by spapr_drc_index() without checking it for NULL.
> In this case we would be dereferencing a NULL pointer when doing
> SPAPR_NVDIMM(drc->dev) and PC_DIMM(drc->dev).
>
> This can happen if, during a scm_flush(), the DRC object is wrongly
> freed/released by another part of the code (i.e. hotunplug the device).
> spapr_drc_index() would then return NULL in the callbacks.
I'm not entirely clear if you're saying this would only happen due to
a bug elsewhere in the code, or if there's some unusual race case or
set of guest/user actions that could trigger this.
>
> Fixes: Coverity CID 1487108, 1487178
> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
> ---
> hw/ppc/spapr_nvdimm.c | 26 ++++++++++++++++++++++----
> 1 file changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/hw/ppc/spapr_nvdimm.c b/hw/ppc/spapr_nvdimm.c
> index c4c97da5de..e92d92fdae 100644
> --- a/hw/ppc/spapr_nvdimm.c
> +++ b/hw/ppc/spapr_nvdimm.c
> @@ -447,9 +447,19 @@ static int flush_worker_cb(void *opaque)
> {
> SpaprNVDIMMDeviceFlushState *state = opaque;
> SpaprDrc *drc = spapr_drc_by_index(state->drcidx);
> - PCDIMMDevice *dimm = PC_DIMM(drc->dev);
> - HostMemoryBackend *backend = MEMORY_BACKEND(dimm->hostmem);
> - int backend_fd = memory_region_get_fd(&backend->mr);
> + PCDIMMDevice *dimm;
> + HostMemoryBackend *backend;
> + int backend_fd;
> +
> + if (!drc) {
> + error_report("papr_scm: Could not find nvdimm device with DRC 0x%u",
> + state->drcidx);
> + return H_HARDWARE;
If this does indicate a bug elswhere in qemu, this should probably be
an assert rather than an H_HARDWARE.
> + }
> +
> + dimm = PC_DIMM(drc->dev);
> + backend = MEMORY_BACKEND(dimm->hostmem);
> + backend_fd = memory_region_get_fd(&backend->mr);
>
> if (object_property_get_bool(OBJECT(backend), "pmem", NULL)) {
> MemoryRegion *mr = host_memory_backend_get_memory(dimm->hostmem);
> @@ -475,7 +485,15 @@ static void spapr_nvdimm_flush_completion_cb(void *opaque, int hcall_ret)
> {
> SpaprNVDIMMDeviceFlushState *state = opaque;
> SpaprDrc *drc = spapr_drc_by_index(state->drcidx);
> - SpaprNVDIMMDevice *s_nvdimm = SPAPR_NVDIMM(drc->dev);
> + SpaprNVDIMMDevice *s_nvdimm;
> +
> + if (!drc) {
> + error_report("papr_scm: Could not find nvdimm device with DRC 0x%u",
> + state->drcidx);
> + return;
> + }
> +
> + s_nvdimm = SPAPR_NVDIMM(drc->dev);
>
> state->hcall_ret = hcall_ret;
> QLIST_REMOVE(state, node);
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
prev parent reply other threads:[~2022-04-06 9:23 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-05 20:34 [PATCH for-7.1 0/1] Coverity fixes in hw/ppc/spapr_nvdimm.c Daniel Henrique Barboza
2022-04-05 20:34 ` [PATCH for-7.1 1/1] hw/ppc: check if spapr_drc_index() returns NULL in spapr_nvdimm.c Daniel Henrique Barboza
2022-04-06 3:03 ` David Gibson [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=Yk0DD+B7MmRtcILR@yekko \
--to=david@gibson.dropbear.id.au \
--cc=clg@kaod.org \
--cc=danielhb413@gmail.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.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 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.