瀏覽代碼

ftgmac100: check RX and TX buffer alignment

These buffers should be aligned on 16 bytes.

Ignore invalid RX and TX buffer addresses and log an error. All
incoming and outgoing traffic will be dropped because no valid RX or
TX descriptors will be available.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-id: 20200114103433.30534-4-clg@kaod.org
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Cédric Le Goater 5 年之前
父節點
當前提交
55efb36519
共有 1 個文件被更改,包括 13 次插入0 次删除
  1. 13 0
      hw/net/ftgmac100.c

+ 13 - 0
hw/net/ftgmac100.c

@@ -198,6 +198,8 @@ typedef struct {
     uint32_t        des3;
     uint32_t        des3;
 } FTGMAC100Desc;
 } FTGMAC100Desc;
 
 
+#define FTGMAC100_DESC_ALIGNMENT 16
+
 /*
 /*
  * Specific RTL8211E MII Registers
  * Specific RTL8211E MII Registers
  */
  */
@@ -722,6 +724,12 @@ static void ftgmac100_write(void *opaque, hwaddr addr,
         s->itc = value;
         s->itc = value;
         break;
         break;
     case FTGMAC100_RXR_BADR: /* Ring buffer address */
     case FTGMAC100_RXR_BADR: /* Ring buffer address */
+        if (!QEMU_IS_ALIGNED(value, FTGMAC100_DESC_ALIGNMENT)) {
+            qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad RX buffer alignment 0x%"
+                          HWADDR_PRIx "\n", __func__, value);
+            return;
+        }
+
         s->rx_ring = value;
         s->rx_ring = value;
         s->rx_descriptor = s->rx_ring;
         s->rx_descriptor = s->rx_ring;
         break;
         break;
@@ -731,6 +739,11 @@ static void ftgmac100_write(void *opaque, hwaddr addr,
         break;
         break;
 
 
     case FTGMAC100_NPTXR_BADR: /* Transmit buffer address */
     case FTGMAC100_NPTXR_BADR: /* Transmit buffer address */
+        if (!QEMU_IS_ALIGNED(value, FTGMAC100_DESC_ALIGNMENT)) {
+            qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad TX buffer alignment 0x%"
+                          HWADDR_PRIx "\n", __func__, value);
+            return;
+        }
         s->tx_ring = value;
         s->tx_ring = value;
         s->tx_descriptor = s->tx_ring;
         s->tx_descriptor = s->tx_ring;
         break;
         break;