From 7bd3000cf22a91e6bc6afc1e7adbf0ae1b731104 Mon Sep 17 00:00:00 2001 From: Jon Maloy Date: Tue, 13 Apr 2021 22:45:17 -0400 Subject: [PATCH 2/5] e1000: fail early for evil descriptor RH-Author: Jon Maloy Message-id: <20210413224517.3841507-2-jmaloy@redhat.com> Patchwork-id: 101473 O-Subject: [RHEL-8.5.0 qemu-kvm PATCH 1/1] e1000: fail early for evil descriptor Bugzilla: 1930092 RH-Acked-by: Stefano Garzarella RH-Acked-by: Laszlo Ersek RH-Acked-by: Stefan Hajnoczi From: Jason Wang During procss_tx_desc(), driver can try to chain data descriptor with legacy descriptor, when will lead underflow for the following calculation in process_tx_desc() for bytes: if (tp->size + bytes > msh) bytes = msh - tp->size; This will lead a infinite loop. So check and fail early if tp->size if greater or equal to msh. Reported-by: Alexander Bulekov Reported-by: Cheolwoo Myung Reported-by: Ruhr-University Bochum Cc: Prasad J Pandit Cc: qemu-stable@nongnu.org Signed-off-by: Jason Wang (cherry picked from commit 3de46e6fc489c52c9431a8a832ad8170a7569bd8) Signed-off-by: Jon Maloy Signed-off-by: Danilo C. L. de Paula --- hw/net/e1000.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hw/net/e1000.c b/hw/net/e1000.c index fc73fdd6fa..fe56bccd52 100644 --- a/hw/net/e1000.c +++ b/hw/net/e1000.c @@ -671,6 +671,9 @@ process_tx_desc(E1000State *s, struct e1000_tx_desc *dp) msh = tp->tso_props.hdr_len + tp->tso_props.mss; do { bytes = split_size; + if (tp->size >= msh) { + goto eop; + } if (tp->size + bytes > msh) bytes = msh - tp->size; @@ -696,6 +699,7 @@ process_tx_desc(E1000State *s, struct e1000_tx_desc *dp) tp->size += split_size; } +eop: if (!(txd_lower & E1000_TXD_CMD_EOP)) return; if (!(tp->cptse && tp->size < tp->tso_props.hdr_len)) { -- 2.27.0