qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] e1000: fix tx re-entrancy problem
@ 2021-10-21 16:10 Jon Maloy
  2021-10-27  4:40 ` Jason Wang
  2021-12-16  9:36 ` Philippe Mathieu-Daudé
  0 siblings, 2 replies; 7+ messages in thread
From: Jon Maloy @ 2021-10-21 16:10 UTC (permalink / raw)
  To: qemu-devel; +Cc: jmaloy

The fact that the MMIO handler is not re-entrant causes an infinite
loop under certain conditions:

Guest write to TDT ->  Loopback -> RX (DMA to TDT) -> TX

We now eliminate the effect of this problem locally in e1000, by adding
a boolean in struct E1000State indicating when the TX side is busy. This
will cause any entering new call to return early instead of interfering
with the ongoing work, and eliminates any risk of looping.

This is intended to address CVE-2021-20257.

Signed-off-by: Jon Maloy <jmaloy@redhat.com>
---
 hw/net/e1000.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/hw/net/e1000.c b/hw/net/e1000.c
index a30546c5d5..f5bc81296d 100644
--- a/hw/net/e1000.c
+++ b/hw/net/e1000.c
@@ -107,6 +107,7 @@ struct E1000State_st {
         e1000x_txd_props props;
         e1000x_txd_props tso_props;
         uint16_t tso_frames;
+        bool busy;
     } tx;
 
     struct {
@@ -763,6 +764,11 @@ start_xmit(E1000State *s)
         return;
     }
 
+    if (s->tx.busy) {
+        return;
+    }
+    s->tx.busy = true;
+
     while (s->mac_reg[TDH] != s->mac_reg[TDT]) {
         base = tx_desc_base(s) +
                sizeof(struct e1000_tx_desc) * s->mac_reg[TDH];
@@ -789,6 +795,7 @@ start_xmit(E1000State *s)
             break;
         }
     }
+    s->tx.busy = false;
     set_ics(s, 0, cause);
 }
 
-- 
2.31.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-12-16 20:19 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-10-21 16:10 [PATCH] e1000: fix tx re-entrancy problem Jon Maloy
2021-10-27  4:40 ` Jason Wang
2021-12-16  9:36 ` Philippe Mathieu-Daudé
2021-12-16 15:51   ` Jon Maloy
2021-12-16 18:35     ` Philippe Mathieu-Daudé
2021-12-16 19:01       ` Alexander Bulekov
2021-12-16 20:22         ` Jon Maloy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).