Commit dca5161f authored by Michael Kelley's avatar Michael Kelley Committed by Paolo Abeni
Browse files

hv_netvsc: Check status in SEND_RNDIS_PKT completion message



Completion responses to SEND_RNDIS_PKT messages are currently processed
regardless of the status in the response, so that resources associated
with the request are freed.  While this is appropriate, code bugs that
cause sending a malformed message, or errors on the Hyper-V host, go
undetected. Fix this by checking the status and outputting a rate-limited
message if there is an error.

Signed-off-by: default avatarMichael Kelley <mikelley@microsoft.com>
Reviewed-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
Link: https://lore.kernel.org/r/1676264881-48928-1-git-send-email-mikelley@microsoft.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 991cbd4f
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -851,6 +851,7 @@ static void netvsc_send_completion(struct net_device *ndev,
	u32 msglen = hv_pkt_datalen(desc);
	struct nvsp_message *pkt_rqst;
	u64 cmd_rqst;
	u32 status;

	/* First check if this is a VMBUS completion without data payload */
	if (!msglen) {
@@ -922,6 +923,23 @@ static void netvsc_send_completion(struct net_device *ndev,
		break;

	case NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE:
		if (msglen < sizeof(struct nvsp_message_header) +
		    sizeof(struct nvsp_1_message_send_rndis_packet_complete)) {
			if (net_ratelimit())
				netdev_err(ndev, "nvsp_rndis_pkt_complete length too small: %u\n",
					   msglen);
			return;
		}

		/* If status indicates an error, output a message so we know
		 * there's a problem. But process the completion anyway so the
		 * resources are released.
		 */
		status = nvsp_packet->msg.v1_msg.send_rndis_pkt_complete.status;
		if (status != NVSP_STAT_SUCCESS && net_ratelimit())
			netdev_err(ndev, "nvsp_rndis_pkt_complete error status: %x\n",
				   status);

		netvsc_send_tx_complete(ndev, net_device, incoming_channel,
					desc, budget);
		break;