* [PATCH v2 1/2] drm/hyperv: validate resolution_count and harden VSP request paths [not found] ` <20260517-drm-hyperv-cover-v2@berkoc.com> @ 2026-05-17 14:25 ` Berkant Koc 2026-05-19 18:33 ` Michael Kelley 2026-05-17 14:25 ` [PATCH v2 2/2] drm/hyperv: validate VMBus packet size in receive callback Berkant Koc 1 sibling, 1 reply; 4+ messages in thread From: Berkant Koc @ 2026-05-17 14:25 UTC (permalink / raw) To: Saurabh Sengar, Dexuan Cui, Long Li Cc: linux-hyperv, dri-devel, linux-kernel, K. Y. Srinivasan, Haiyang Zhang, Wei Liu, Michael Kelley, Thomas Zimmermann, Maarten Lankhorst, Maxime Ripard, Deepak Rawat, stable The synthetic video device parses a SYNTHVID_RESOLUTION_RESPONSE that contains a u8 resolution_count and a u8 default_resolution_index. The existing check rejects resolution_count == 0 and an index greater or equal to resolution_count, but does not bound resolution_count itself against the fixed supported_resolution[SYNTHVID_MAX_RESOLUTION_COUNT] array. A host that returns resolution_count > 64 together with an in-range default_resolution_index causes the subsequent loop to read past the array. Reject any resolution_count that exceeds the array bound, folded into the existing zero-check so a single log entry remains per failure. When that bounds check (or any later failure in hyperv_get_supported_resolution()) returns an error, the caller in hyperv_connect_vsp() previously logged a warning and continued without populating hv->screen_width_max / hv->screen_height_max / preferred_*. hyperv_mode_config_init() then set dev->mode_config.max_width and max_height to 0, which makes drm_internal_framebuffer_create() reject every userspace framebuffer with -EINVAL. Populate the fields with the WIN8 defaults that the pre-WIN10 branch already uses so a failed resolution probe degrades to a usable display instead of disabling it. The driver also issues three sequential VSP requests (negotiate version, update VRAM location, get supported resolution) that share a single hv->wait completion. None of the call sites call reinit_completion() between requests. If wait_for_completion_timeout() returns 0 but a delayed response later triggers complete(&hv->wait) in the receive callback, the next request's wait can consume that stale completion, return immediately, and parse stale data out of hv->init_buf. Call reinit_completion() before each send so every request waits for its own response. Fixes: 76c56a5affeb ("drm/hyperv: Add DRM driver for hyperv synthetic video device") Cc: stable@vger.kernel.org # 5.14+ Signed-off-by: Berkant Koc <me@berkoc.com> --- drivers/gpu/drm/hyperv/hyperv_drm_proto.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/hyperv/hyperv_drm_proto.c b/drivers/gpu/drm/hyperv/hyperv_drm_proto.c index 051ecc526832..3b5065fe06e4 100644 --- a/drivers/gpu/drm/hyperv/hyperv_drm_proto.c +++ b/drivers/gpu/drm/hyperv/hyperv_drm_proto.c @@ -223,6 +223,7 @@ static int hyperv_negotiate_version(struct hv_device *hdev, u32 ver) msg->vid_hdr.size = sizeof(struct synthvid_msg_hdr) + sizeof(struct synthvid_version_req); msg->ver_req.version = ver; + reinit_completion(&hv->wait); hyperv_sendpacket(hdev, msg); t = wait_for_completion_timeout(&hv->wait, VMBUS_VSP_TIMEOUT); @@ -257,6 +258,7 @@ int hyperv_update_vram_location(struct hv_device *hdev, phys_addr_t vram_pp) msg->vram.user_ctx = vram_pp; msg->vram.vram_gpa = vram_pp; msg->vram.is_vram_gpa_specified = 1; + reinit_completion(&hv->wait); hyperv_sendpacket(hdev, msg); t = wait_for_completion_timeout(&hv->wait, VMBUS_VSP_TIMEOUT); @@ -383,6 +385,7 @@ static int hyperv_get_supported_resolution(struct hv_device *hdev) sizeof(struct synthvid_supported_resolution_req); msg->resolution_req.maximum_resolution_count = SYNTHVID_MAX_RESOLUTION_COUNT; + reinit_completion(&hv->wait); hyperv_sendpacket(hdev, msg); t = wait_for_completion_timeout(&hv->wait, VMBUS_VSP_TIMEOUT); @@ -391,8 +394,11 @@ static int hyperv_get_supported_resolution(struct hv_device *hdev) return -ETIMEDOUT; } - if (msg->resolution_resp.resolution_count == 0) { - drm_err(dev, "No supported resolutions\n"); + if (msg->resolution_resp.resolution_count == 0 || + msg->resolution_resp.resolution_count > + SYNTHVID_MAX_RESOLUTION_COUNT) { + drm_err(dev, "Invalid resolution count: %d\n", + msg->resolution_resp.resolution_count); return -ENODEV; } @@ -506,8 +512,13 @@ int hyperv_connect_vsp(struct hv_device *hdev) if (hyperv_version_ge(hv->synthvid_version, SYNTHVID_VERSION_WIN10)) { ret = hyperv_get_supported_resolution(hdev); - if (ret) + if (ret) { drm_err(dev, "Failed to get supported resolution from host, use default\n"); + hv->screen_width_max = SYNTHVID_WIDTH_WIN8; + hv->screen_height_max = SYNTHVID_HEIGHT_WIN8; + hv->preferred_width = SYNTHVID_WIDTH_WIN8; + hv->preferred_height = SYNTHVID_HEIGHT_WIN8; + } } else { hv->screen_width_max = SYNTHVID_WIDTH_WIN8; hv->screen_height_max = SYNTHVID_HEIGHT_WIN8; -- 2.47.3 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* RE: [PATCH v2 1/2] drm/hyperv: validate resolution_count and harden VSP request paths 2026-05-17 14:25 ` [PATCH v2 1/2] drm/hyperv: validate resolution_count and harden VSP request paths Berkant Koc @ 2026-05-19 18:33 ` Michael Kelley 0 siblings, 0 replies; 4+ messages in thread From: Michael Kelley @ 2026-05-19 18:33 UTC (permalink / raw) To: Berkant Koc, Saurabh Sengar, Dexuan Cui, Long Li Cc: linux-hyperv@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, K. Y. Srinivasan, Haiyang Zhang, Wei Liu, Michael Kelley, Thomas Zimmermann, Maarten Lankhorst, Maxime Ripard, Deepak Rawat, stable@vger.kernel.org From: Berkant Koc <me@berkoc.com> Sent: Sunday, May 17, 2026 7:25 AM > > The synthetic video device parses a SYNTHVID_RESOLUTION_RESPONSE that > contains a u8 resolution_count and a u8 default_resolution_index. The > existing check rejects resolution_count == 0 and an index greater or > equal to resolution_count, but does not bound resolution_count itself > against the fixed supported_resolution[SYNTHVID_MAX_RESOLUTION_COUNT] > array. A host that returns resolution_count > 64 together with an > in-range default_resolution_index causes the subsequent loop to read > past the array. Reject any resolution_count that exceeds the array > bound, folded into the existing zero-check so a single log entry > remains per failure. I think this is a good fix, but let me provide some background. A core assumption has been that the Hyper-V host is not malicious, and data from the host can be trusted to be well-formed and valid. Linux code interacting with the host does *not* take a paranoid approach and does *not* validate every value received from the host. Existing validation is ad hoc and probably not comprehensive. A few years ago with the introduction of Confidential Computing and "CoCo VMs" in in Linux, the assumption changed. (Hyper-V calls these "Confidential VMs", or sometimes "Isolated VMs" -- unfortunately, the terminology is a bit scattered.) The host is treated as potentially malicious and Linux code was hardened against bad values passed from the host. But not all drivers for Hyper-V synthetic devices were hardened because CoCo VMs on Hyper-V don't allow all the possible synthetic devices. The Hyper-V synthetic frame buffer is one such disallowed device, so the Hyper-V DRM driver was not hardened. The allowed devices can be seen in the vmbus_devs[] array where .allowed_in_isolation is "true". All that said, I'm in favor of adding hardening, even if it is done piecemeal. There won't likely be a comprehensive effort to harden the Hyper-V DRM driver unless the frame buffer device becomes available in a CoCo VM. > > When that bounds check (or any later failure in > hyperv_get_supported_resolution()) returns an error, the caller in > hyperv_connect_vsp() previously logged a warning and continued without > populating hv->screen_width_max / hv->screen_height_max / preferred_*. > hyperv_mode_config_init() then set dev->mode_config.max_width and > max_height to 0, which makes drm_internal_framebuffer_create() reject > every userspace framebuffer with -EINVAL. Populate the fields with the > WIN8 defaults that the pre-WIN10 branch already uses so a failed > resolution probe degrades to a usable display instead of disabling it. Yes, this also makes sense. > > The driver also issues three sequential VSP requests (negotiate > version, update VRAM location, get supported resolution) that share a > single hv->wait completion. None of the call sites call > reinit_completion() between requests. If wait_for_completion_timeout() > returns 0 but a delayed response later triggers complete(&hv->wait) in > the receive callback, the next request's wait can consume that stale > completion, return immediately, and parse stale data out of > hv->init_buf. Call reinit_completion() before each send so every > request waits for its own response. This change should probably be a separate patch, as it's not really related to the bounds checking issue. You could even argue that the bounds check and using the default size values in case of an error should be separate patches, but it's a judgment call and I could go either way. Combining the first two works for me, though someone else might disagree. All that notwithstanding, I don't think your fix is needed in its current form. If wait_for_completion_timeout() times out in "negotiate version" or "update VRAM location", the code returns -ETIMEDOUT. The caller then bails out and does not send the next message in the sequence. Eventually hyperv_vmbus_probe() fails and the struct hyperv_drm_device memory is freed. A similar thing could happen with hyperv_vmbus_resume(). The memory isn't freed, but if the resume fails and is tried again later, it should be with a fresh copy of the saved memory image. In that case, the completion should be clean for the retry. The problem case is "get supported resolution", which would leave the completion in a pending state if it times out. This could later affect hyperv_vmbus_resume(). I could see reinit'ing the completion in hyperv_vmbus_resume() to handle this case. But double-check my thinking on all this. Maybe I'm missing something. One other comment: In my view, your commit message is a bit too detailed. A commit message should focus on "why" the change, and less on the details of the implementation. Explaining the failure case is fine, but don't recapitulate code that is straightforward and obvious. > > Fixes: 76c56a5affeb ("drm/hyperv: Add DRM driver for hyperv synthetic video device") > Cc: stable@vger.kernel.org # 5.14+ > Signed-off-by: Berkant Koc <me@berkoc.com> > --- > drivers/gpu/drm/hyperv/hyperv_drm_proto.c | 17 ++++++++++++++--- > 1 file changed, 14 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/hyperv/hyperv_drm_proto.c > b/drivers/gpu/drm/hyperv/hyperv_drm_proto.c > index 051ecc526832..3b5065fe06e4 100644 > --- a/drivers/gpu/drm/hyperv/hyperv_drm_proto.c > +++ b/drivers/gpu/drm/hyperv/hyperv_drm_proto.c > @@ -223,6 +223,7 @@ static int hyperv_negotiate_version(struct hv_device *hdev, u32 ver) > msg->vid_hdr.size = sizeof(struct synthvid_msg_hdr) + > sizeof(struct synthvid_version_req); > msg->ver_req.version = ver; > + reinit_completion(&hv->wait); > hyperv_sendpacket(hdev, msg); > > t = wait_for_completion_timeout(&hv->wait, VMBUS_VSP_TIMEOUT); > @@ -257,6 +258,7 @@ int hyperv_update_vram_location(struct hv_device *hdev, phys_addr_t vram_pp) > msg->vram.user_ctx = vram_pp; > msg->vram.vram_gpa = vram_pp; > msg->vram.is_vram_gpa_specified = 1; > + reinit_completion(&hv->wait); > hyperv_sendpacket(hdev, msg); > > t = wait_for_completion_timeout(&hv->wait, VMBUS_VSP_TIMEOUT); > @@ -383,6 +385,7 @@ static int hyperv_get_supported_resolution(struct hv_device *hdev) > sizeof(struct synthvid_supported_resolution_req); > msg->resolution_req.maximum_resolution_count = > SYNTHVID_MAX_RESOLUTION_COUNT; > + reinit_completion(&hv->wait); > hyperv_sendpacket(hdev, msg); > > t = wait_for_completion_timeout(&hv->wait, VMBUS_VSP_TIMEOUT); > @@ -391,8 +394,11 @@ static int hyperv_get_supported_resolution(struct hv_device *hdev) > return -ETIMEDOUT; > } > > - if (msg->resolution_resp.resolution_count == 0) { > - drm_err(dev, "No supported resolutions\n"); > + if (msg->resolution_resp.resolution_count == 0 || > + msg->resolution_resp.resolution_count > > + SYNTHVID_MAX_RESOLUTION_COUNT) { > + drm_err(dev, "Invalid resolution count: %d\n", > + msg->resolution_resp.resolution_count); > return -ENODEV; > } > > @@ -506,8 +512,13 @@ int hyperv_connect_vsp(struct hv_device *hdev) > > if (hyperv_version_ge(hv->synthvid_version, SYNTHVID_VERSION_WIN10)) { > ret = hyperv_get_supported_resolution(hdev); > - if (ret) > + if (ret) { > drm_err(dev, "Failed to get supported resolution from host, use default\n"); > + hv->screen_width_max = SYNTHVID_WIDTH_WIN8; > + hv->screen_height_max = SYNTHVID_HEIGHT_WIN8; > + hv->preferred_width = SYNTHVID_WIDTH_WIN8; > + hv->preferred_height = SYNTHVID_HEIGHT_WIN8; > + } > } else { > hv->screen_width_max = SYNTHVID_WIDTH_WIN8; > hv->screen_height_max = SYNTHVID_HEIGHT_WIN8; Is there a separate problem here in that preferred_width and preferred_height are not set in the pre-WIN10 case? I'm not familiar enough with DRM driver code to know how these preferred values are used. It looks inconsistent to have the two fallback cases be different. Also, having to duplicate the fallback code is distasteful. Instead of having an "else" clause, maybe have a follow-up test for screen_width_max (or any of the values) being zero as an indicator that they haven't been set, and apply the defaults in that case? Michael ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 2/2] drm/hyperv: validate VMBus packet size in receive callback [not found] ` <20260517-drm-hyperv-cover-v2@berkoc.com> 2026-05-17 14:25 ` [PATCH v2 1/2] drm/hyperv: validate resolution_count and harden VSP request paths Berkant Koc @ 2026-05-17 14:25 ` Berkant Koc 2026-05-19 18:33 ` Michael Kelley 1 sibling, 1 reply; 4+ messages in thread From: Berkant Koc @ 2026-05-17 14:25 UTC (permalink / raw) To: Saurabh Sengar, Dexuan Cui, Long Li Cc: linux-hyperv, dri-devel, linux-kernel, K. Y. Srinivasan, Haiyang Zhang, Wei Liu, Michael Kelley, Thomas Zimmermann, Maarten Lankhorst, Maxime Ripard, Deepak Rawat, stable hyperv_receive() reads bytes_recvd from vmbus_recvpacket() but does not forward that value to hyperv_receive_sub(). The sub-handler reads msg->vid_hdr.type and msg->feature_chg.is_dirt_needed without knowing how many bytes the host actually wrote, so a short packet leaves the parser reading bytes that the host did not write in this packet. The unconditional memcpy(hv->init_buf, msg, VMBUS_MAX_PACKET_SIZE) on the wait-completion path also copies the full 16 KiB recv_buf regardless of bytes_recvd, including any residue from the prior message. Pass bytes_recvd into hyperv_receive_sub() and reject any packet shorter than the pipe + synthvid header. The dirt-feature branch additionally requires the feature_change payload size before reading is_dirt_needed. The init_buf copy now uses bytes_recvd as the length argument, which keeps it bounded by VMBUS_MAX_PACKET_SIZE through the new upper check. Unchanged from v1. Fixes: 76c56a5affeb ("drm/hyperv: Add DRM driver for hyperv synthetic video device") Cc: stable@vger.kernel.org # 5.14+ Signed-off-by: Berkant Koc <me@berkoc.com> --- drivers/gpu/drm/hyperv/hyperv_drm_proto.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/hyperv/hyperv_drm_proto.c b/drivers/gpu/drm/hyperv/hyperv_drm_proto.c index 3b5065fe06e4..cdab4895dd40 100644 --- a/drivers/gpu/drm/hyperv/hyperv_drm_proto.c +++ b/drivers/gpu/drm/hyperv/hyperv_drm_proto.c @@ -423,26 +423,35 @@ static int hyperv_get_supported_resolution(struct hv_device *hdev) return 0; } -static void hyperv_receive_sub(struct hv_device *hdev) +static void hyperv_receive_sub(struct hv_device *hdev, u32 bytes_recvd) { struct hyperv_drm_device *hv = hv_get_drvdata(hdev); struct synthvid_msg *msg; + size_t hdr_size; if (!hv) return; + hdr_size = sizeof(struct pipe_msg_hdr) + + sizeof(struct synthvid_msg_hdr); + if (bytes_recvd < hdr_size || bytes_recvd > VMBUS_MAX_PACKET_SIZE) + return; + msg = (struct synthvid_msg *)hv->recv_buf; /* Complete the wait event */ if (msg->vid_hdr.type == SYNTHVID_VERSION_RESPONSE || msg->vid_hdr.type == SYNTHVID_RESOLUTION_RESPONSE || msg->vid_hdr.type == SYNTHVID_VRAM_LOCATION_ACK) { - memcpy(hv->init_buf, msg, VMBUS_MAX_PACKET_SIZE); + memcpy(hv->init_buf, msg, bytes_recvd); complete(&hv->wait); return; } if (msg->vid_hdr.type == SYNTHVID_FEATURE_CHANGE) { + if (bytes_recvd < hdr_size + + sizeof(struct synthvid_feature_change)) + return; hv->dirt_needed = msg->feature_chg.is_dirt_needed; if (hv->dirt_needed) hyperv_hide_hw_ptr(hv->hdev); @@ -469,7 +478,7 @@ static void hyperv_receive(void *ctx) &bytes_recvd, &req_id); if (bytes_recvd > 0 && recv_buf->pipe_hdr.type == PIPE_MSG_DATA) - hyperv_receive_sub(hdev); + hyperv_receive_sub(hdev, bytes_recvd); } while (bytes_recvd > 0 && ret == 0); } -- 2.47.3 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* RE: [PATCH v2 2/2] drm/hyperv: validate VMBus packet size in receive callback 2026-05-17 14:25 ` [PATCH v2 2/2] drm/hyperv: validate VMBus packet size in receive callback Berkant Koc @ 2026-05-19 18:33 ` Michael Kelley 0 siblings, 0 replies; 4+ messages in thread From: Michael Kelley @ 2026-05-19 18:33 UTC (permalink / raw) To: Berkant Koc, Saurabh Sengar, Dexuan Cui, Long Li Cc: linux-hyperv@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, K. Y. Srinivasan, Haiyang Zhang, Wei Liu, Michael Kelley, Thomas Zimmermann, Maarten Lankhorst, Maxime Ripard, Deepak Rawat, stable@vger.kernel.org From: Berkant Koc <me@berkoc.com> Sent: Sunday, May 17, 2026 7:25 AM > > hyperv_receive() reads bytes_recvd from vmbus_recvpacket() but does not > forward that value to hyperv_receive_sub(). The sub-handler reads > msg->vid_hdr.type and msg->feature_chg.is_dirt_needed without knowing > how many bytes the host actually wrote, so a short packet leaves the > parser reading bytes that the host did not write in this packet. This is a valid concern. Similar patterns have hopefully been fixed in other drivers that were hardened for CoCo VMs. > The unconditional memcpy(hv->init_buf, msg, VMBUS_MAX_PACKET_SIZE) on the > wait-completion path also copies the full 16 KiB recv_buf regardless > of bytes_recvd, including any residue from the prior message. Does copying the full 16 KiB break anything? Or are you flagging as just wasteful activity? This gets to what I previously mentioned about commit messages -- explain "why". Being wasteful is a valid reason, but it can be helpful to future readers to be explicit about the "why". > > Pass bytes_recvd into hyperv_receive_sub() and reject any packet shorter > than the pipe + synthvid header. The dirt-feature branch additionally > requires the feature_change payload size before reading is_dirt_needed. > The init_buf copy now uses bytes_recvd as the length argument, which > keeps it bounded by VMBUS_MAX_PACKET_SIZE through the new upper check. > > Unchanged from v1. Version related comments should go below the "---" following the Signed-off line. They will be visible in the patch emails, but won't get put into the git log when the patch is finally accepted. The Linux kernel doesn't want to clutter the git log with intermediate version information that accumulates as the patch is reviewed and revised. > > Fixes: 76c56a5affeb ("drm/hyperv: Add DRM driver for hyperv synthetic video device") > Cc: stable@vger.kernel.org # 5.14+ > Signed-off-by: Berkant Koc <me@berkoc.com> > --- > drivers/gpu/drm/hyperv/hyperv_drm_proto.c | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/hyperv/hyperv_drm_proto.c > b/drivers/gpu/drm/hyperv/hyperv_drm_proto.c > index 3b5065fe06e4..cdab4895dd40 100644 > --- a/drivers/gpu/drm/hyperv/hyperv_drm_proto.c > +++ b/drivers/gpu/drm/hyperv/hyperv_drm_proto.c > @@ -423,26 +423,35 @@ static int hyperv_get_supported_resolution(struct hv_device *hdev) > return 0; > } > > -static void hyperv_receive_sub(struct hv_device *hdev) > +static void hyperv_receive_sub(struct hv_device *hdev, u32 bytes_recvd) > { > struct hyperv_drm_device *hv = hv_get_drvdata(hdev); > struct synthvid_msg *msg; > + size_t hdr_size; > > if (!hv) > return; > > + hdr_size = sizeof(struct pipe_msg_hdr) + > + sizeof(struct synthvid_msg_hdr); > + if (bytes_recvd < hdr_size || bytes_recvd > VMBUS_MAX_PACKET_SIZE) The check against VMBUS_MAX_PACKET_SIZE shouldn't be needed. vmbus_recvpacket() takes VMBUS_MAX_PACKET_SIZE as the max receive size and won't return a bytes_recvd value that is larger. > + return; In similar cases in other drivers that have been hardened for CoCo VMs, the code outputs a rate limited error message. That should be done here so the bad received message isn't just ignored. See hv_kvp_onchannelcallback() for example. > + > msg = (struct synthvid_msg *)hv->recv_buf; > > /* Complete the wait event */ > if (msg->vid_hdr.type == SYNTHVID_VERSION_RESPONSE || > msg->vid_hdr.type == SYNTHVID_RESOLUTION_RESPONSE || > msg->vid_hdr.type == SYNTHVID_VRAM_LOCATION_ACK) { > - memcpy(hv->init_buf, msg, VMBUS_MAX_PACKET_SIZE); > + memcpy(hv->init_buf, msg, bytes_recvd); Additional logic is needed here. Each of the three message types in the "if" statement has data beyond just the header. Before doing the memcpy() and complete(), the code should validate that the msg is big enough to contain that expected data. I.e., it needs to do the same as you have done for SYNTHVID_FEATURE_CHANGE. Otherwise, the code that wakes up from the completion will think that it has valid data to work with, and it may not. Of course, the problem already exists in the upstream code. But if you are going to make changes to fix the problem, the fix should fully handle situation and not just be a partial fix. > complete(&hv->wait); > return; > } > > if (msg->vid_hdr.type == SYNTHVID_FEATURE_CHANGE) { > + if (bytes_recvd < hdr_size + > + sizeof(struct synthvid_feature_change)) > + return; Same here. Output a rate limited error message. > hv->dirt_needed = msg->feature_chg.is_dirt_needed; > if (hv->dirt_needed) > hyperv_hide_hw_ptr(hv->hdev); > @@ -469,7 +478,7 @@ static void hyperv_receive(void *ctx) > &bytes_recvd, &req_id); > if (bytes_recvd > 0 && > recv_buf->pipe_hdr.type == PIPE_MSG_DATA) > - hyperv_receive_sub(hdev); > + hyperv_receive_sub(hdev, bytes_recvd); > } while (bytes_recvd > 0 && ret == 0); > } > > -- > 2.47.3 > ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-05-19 18:33 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20260517-drm-hyperv-cover@berkoc.com>
[not found] ` <20260517-drm-hyperv-patch1@berkoc.com>
[not found] ` <20260517134926.B4179C2BCB0@smtp.kernel.org>
[not found] ` <20260517-drm-hyperv-cover-v2@berkoc.com>
2026-05-17 14:25 ` [PATCH v2 1/2] drm/hyperv: validate resolution_count and harden VSP request paths Berkant Koc
2026-05-19 18:33 ` Michael Kelley
2026-05-17 14:25 ` [PATCH v2 2/2] drm/hyperv: validate VMBus packet size in receive callback Berkant Koc
2026-05-19 18:33 ` Michael Kelley
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox