Re: [PATCH net v4 4/7] net: mana: validate hardware-supplied values in the HWC RX path
[email protected] Sun, 09 Aug 2026 02:34:57 +0000
| Newsgroups | org.kernel.vger.linux-hyperv |
|---|---|
| Message-ID | <[email protected]> |
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: Pre-existing issues: - [Critical] Race condition leading to stack memory corruption and Use-After-Free (ABA) on hardware command timeout. -- --- Patch [4]: [PATCH net v4 4/7] net: mana: validate hardware-supplied values in the HWC RX path --- commit 3dd532e8ebcefe4a1f19044be675c58a1504e9c6 Author: Long Li <[email protected]> net: mana: validate hardware-supplied values in the HWC RX path This commit adds validation for hardware-supplied lengths and indices in the MANA hardware channel RX handler. It ensures the inline OOB size, SGE addresses, and response lengths are checked before use. Out-of-bounds or untrusted RX WQEs are leaked and, if exhausted, the channel goes into a terminal state. > diff --git a/drivers/net/ethernet/microsoft/mana/hw_channel.c b/drivers/net/ethernet/microsoft/mana/hw_channel.c > index 19896bb5ce1a4..5db8cfe2d8443 100644 > --- a/drivers/net/ethernet/microsoft/mana/hw_channel.c > +++ b/drivers/net/ethernet/microsoft/mana/hw_channel.c > @@ -83,6 +83,19 @@ static void mana_hwc_handle_resp(struct hw_channel_context *hwc, u32 resp_len, > struct hwc_caller_ctx *ctx; > int err; > > + /* Defence in depth: the sole caller, mana_hwc_rx_event_handler(), > + * already rejects msg_id >= hwc->num_inflight_msg with the value it > + * passes here by value, so this cannot be reached out of range. Keep > + * the guard at the indexing site so the bitmap and caller_ctx array > + * are never indexed without a bound in view. > + */ > + if (msg_id >= hwc->num_inflight_msg) { > + dev_err(hwc->dev, "hwc_rx: msg_id %u >= max %u\n", > + msg_id, hwc->num_inflight_msg); > + mana_hwc_post_rx_wqe(hwc->rxq, rx_req); > + return; > + } > + > if (!test_bit(msg_id, hwc->inflight_msg_res.map)) { > dev_err(hwc->dev, "hwc_rx: invalid msg_id = %u\n", msg_id); > mana_hwc_post_rx_wqe(hwc->rxq, rx_req); [Severity: Critical] This is a pre-existing issue, but is there a race condition between this test_bit() check and the command timeout path that could corrupt stack memory? If a thread calling mana_hwc_send_request() times out, it takes this path: if (!wait_for_completion_timeout(&ctx->comp_event, (hwc->hwc_timeout * HZ) / 1000)) { dev_err(hwc->dev, "HWC: Request timed out!\n"); err = -ETIMEDOUT; goto out; } ... out: mana_hwc_put_msg_index(hwc, msg_id); return err; The timeout path clears the message ID bit and returns without synchronizing with the interrupt handler. Concurrently, if a delayed hardware response arrives here in mana_hwc_handle_resp(), it could pass the test_bit() check right before the timeout path clears it. The timeout thread then clears the bit and returns, popping its stack. Then mana_hwc_handle_resp() proceeds and executes: if (!err && ctx->output_buf) { ctx->status_code = resp_msg->status; memcpy(ctx->output_buf, resp_msg, resp_len); Since ctx->output_buf points to the now-freed stack frame, could this memcpy() write hardware data into a freed stack frame or to the stack frame of a new thread reusing the message ID? -- Sashiko AI review ยท https://sashiko.dev/#/patchset/[email protected]?part=4