From: sashiko-bot@kernel.org
To: "Hongling Zeng" <zenghongling@kylinos.cn>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v5 3/5] nouveau/gsp/rm/alloc: Cleanup IS_ERR_OR_NULL usage
Date: Mon, 22 Jun 2026 09:19:34 +0000 [thread overview]
Message-ID: <20260622091935.3EF581F000E9@smtp.kernel.org> (raw)
In-Reply-To: <1782119051174853.14288.seg@mailgw.kylinos.cn>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [High] Corrupt or oversized GSP messages cause NULL pointer dereferences or false successes because they return NULL instead of an error pointer.
- [High] Leaking the original large RPC payload message in `r535_gsp_rpc_push()` on error paths during chunked transmission.
--
commit be006c1667937e9a2375afa2299598f63205492b
Author: Hongling Zeng <zenghongling@kylinos.cn>
Subject: nouveau/gsp/rm/alloc: Cleanup IS_ERR_OR_NULL usage
This commit changes the error checking in r535_gsp_rpc_rm_free() to use
IS_ERR() instead of IS_ERR_OR_NULL() for the return value of
nvkm_gsp_rpc_get().
> diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/alloc.c b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/alloc.c
> index 46e3a29f2ad7f..c9f86c0e9b255 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/alloc.c
> +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/alloc.c
[ ... ]
> @@ -35,7 +35,7 @@ r535_gsp_rpc_rm_free(struct nvkm_gsp_object *object)
> client->object.handle, object->handle);
>
> rpc = nvkm_gsp_rpc_get(gsp, NV_VGPU_MSG_FUNCTION_FREE, sizeof(*rpc));
> - if (WARN_ON(IS_ERR_OR_NULL(rpc)))
> + if (WARN_ON(IS_ERR(rpc)))
[Severity: High]
This isn't a bug introduced by this patch, but while we are refining the use of
IS_ERR() for RPC messages, could corrupt or oversized GSP messages cause a NULL
pointer dereference or false success elsewhere?
Looking at r535_gsp_msgq_recv() in
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/rpc.c, if an RPC message length
exceeds the maximum size, it issues a WARN_ON and returns NULL instead of an
ERR_PTR:
r535_gsp_msgq_recv() {
...
if (WARN_ON(rpc->length > max_rpc_size))
return NULL;
...
}
This NULL propagates up through r535_gsp_msg_recv() and nvkm_gsp_rpc_push()
back to wrappers. Callers expecting a payload use IS_ERR() to check for errors,
but since IS_ERR(NULL) is false, do these callers incorrectly treat the failure
as a success?
For example, in r535_gsp_get_static_info():
r535_gsp_get_static_info() {
...
rpc = nvkm_gsp_rpc_rd(gsp, NV_VGPU_MSG_FUNCTION_GET_GSP_STATIC_INFO, sizeof(*rpc));
if (IS_ERR(rpc))
return PTR_ERR(rpc);
gsp->internal.client.object.client = &gsp->internal.client;
gsp->internal.client.object.parent = NULL;
gsp->internal.client.object.handle = rpc->hInternalClient;
...
}
Could this bypass lead to a direct NULL pointer dereference, or cause silent
hardware operation failures in functions like nvkm_gsp_rpc_wr() and
nvkm_gsp_rm_alloc_wr() that similarly only check IS_ERR()?
[Severity: High]
This is also a pre-existing issue, but while reviewing the RPC push logic, is
there a memory leak in r535_gsp_rpc_push() for large payloads on error paths?
When the payload size exceeds the maximum, r535_gsp_rpc_push() splits it into
continuation chunks. The original message memory, allocated by
nvkm_gsp_rpc_get(), is not passed to the command queue (which would normally
take ownership). Instead, r535_gsp_rpc_push() attempts to free it manually
only upon successful reply handling:
r535_gsp_rpc_push() {
...
/* Wait for reply. */
repv = r535_gsp_rpc_handle_reply(gsp, fn, policy, payload_size +
sizeof(*rpc));
if (!IS_ERR(repv))
kvfree(msg);
} else {
repv = r535_gsp_rpc_send(gsp, payload, policy, gsp_rpc_len);
}
done:
mutex_unlock(&gsp->cmdq.mutex);
return repv;
}
If sending the chunks fails or if the reply contains an error (such as the GSP
rejecting the command), the function jumps to the done label and returns
without freeing the message.
Since callers typically overwrite their pointer with the return value of
nvkm_gsp_rpc_push() and assume ownership was passed, does this permanently
leak the original payload memory if userspace issues large RPCs that get
rejected?
> return -EIO;
>
> rpc->params.hRoot = client->object.handle;
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260622081136.61695-1-zenghongling@kylinos.cn?part=3
next prev parent reply other threads:[~2026-06-22 9:19 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-22 8:11 [PATCH v5 0/5] nouveau/gsp: Clean up IS_ERR vs IS_ERR_OR_NULL usage Hongling Zeng
2026-06-22 8:11 ` [PATCH v5 1/5] nouveau/gsp/rpc: Document RPC function return value contracts Hongling Zeng
2026-06-22 9:18 ` sashiko-bot
2026-06-22 8:11 ` Hongling Zeng
2026-06-22 8:11 ` Hongling Zeng
2026-06-22 8:21 ` sashiko-bot
2026-06-22 8:11 ` [PATCH v5 2/5] nouveau/gsp/rpc: Cleanup incorrect IS_ERR_OR_NULL in rpc.c Hongling Zeng
2026-06-22 9:22 ` sashiko-bot
2026-06-22 8:11 ` Hongling Zeng
2026-06-22 8:11 ` Hongling Zeng
2026-06-22 8:27 ` sashiko-bot
2026-06-22 8:11 ` [PATCH v5 3/5] nouveau/gsp/rm/alloc: Cleanup IS_ERR_OR_NULL usage Hongling Zeng
2026-06-22 8:25 ` sashiko-bot
2026-06-22 8:11 ` Hongling Zeng
2026-06-22 9:19 ` sashiko-bot [this message]
2026-06-22 8:11 ` [PATCH v5 4/5] nouveau/gsp/rm/bar: " Hongling Zeng
2026-06-22 8:23 ` sashiko-bot
2026-06-22 8:11 ` Hongling Zeng
2026-06-22 9:30 ` sashiko-bot
2026-06-22 8:11 ` [PATCH v5 5/5] nouveau/gsp: Cleanup IS_ERR_OR_NULL in nvkm_gsp_rpc_rd() Hongling Zeng
2026-06-22 9:32 ` sashiko-bot
2026-06-22 8:11 ` Hongling Zeng
2026-06-22 8:11 ` Hongling Zeng
2026-06-22 8:36 ` sashiko-bot
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=20260622091935.3EF581F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=zenghongling@kylinos.cn \
/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.