7c49253
From 95ed56939eb2eaa4e2f349fe6dcd13ca4edfd8fb Mon Sep 17 00:00:00 2001
7c49253
From: Li Qiang <liqiang6-s@360.cn>
7c49253
Date: Tue, 7 Feb 2017 02:23:33 -0800
7c49253
Subject: [PATCH] usb: ohci: limit the number of link eds
7c49253
7c49253
The guest may builds an infinite loop with link eds. This patch
7c49253
limit the number of linked ed to avoid this.
7c49253
7c49253
Signed-off-by: Li Qiang <liqiang6-s@360.cn>
7c49253
Message-id: 5899a02e.45ca240a.6c373.93c1@mx.google.com
7c49253
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
7c49253
---
7c49253
 hw/usb/hcd-ohci.c | 9 ++++++++-
7c49253
 1 file changed, 8 insertions(+), 1 deletion(-)
7c49253
7c49253
diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
7c49253
index 2cba3e3..21c93e0 100644
7c49253
--- a/hw/usb/hcd-ohci.c
7c49253
+++ b/hw/usb/hcd-ohci.c
7c49253
@@ -42,6 +42,8 @@
7c49253
 
7c49253
 #define OHCI_MAX_PORTS 15
7c49253
 
7c49253
+#define ED_LINK_LIMIT 4
7c49253
+
7c49253
 static int64_t usb_frame_time;
7c49253
 static int64_t usb_bit_time;
7c49253
 
7c49253
@@ -1184,7 +1186,7 @@ static int ohci_service_ed_list(OHCIState *ohci, uint32_t head, int completion)
7c49253
     uint32_t next_ed;
7c49253
     uint32_t cur;
7c49253
     int active;
7c49253
-
7c49253
+    uint32_t link_cnt = 0;
7c49253
     active = 0;
7c49253
 
7c49253
     if (head == 0)
7c49253
@@ -1199,6 +1201,11 @@ static int ohci_service_ed_list(OHCIState *ohci, uint32_t head, int completion)
7c49253
 
7c49253
         next_ed = ed.next & OHCI_DPTR_MASK;
7c49253
 
7c49253
+        if (++link_cnt > ED_LINK_LIMIT) {
7c49253
+            ohci_die(ohci);
7c49253
+            return 0;
7c49253
+        }
7c49253
+
7c49253
         if ((ed.head & OHCI_ED_H) || (ed.flags & OHCI_ED_K)) {
7c49253
             uint32_t addr;
7c49253
             /* Cancel pending packets for ED that have been paused.  */
7c49253
-- 
7c49253
1.8.3.1
7c49253