49 lines
1.9 KiB
Diff
49 lines
1.9 KiB
Diff
|
|
From cc875acdbf0ab210ce467f27c621fe7dc2159110 Mon Sep 17 00:00:00 2001
|
||
|
|
From: zhangchujun <zhangchujun@cmss.chinamobile.com>
|
||
|
|
Date: Wed, 30 Oct 2024 10:57:05 +0800
|
||
|
|
Subject: [PATCH] virtio-net: Avoid indirection_table_mask overflow
|
||
|
|
|
||
|
|
We computes indirections_len by adding 1 to indirection_table_mask, but
|
||
|
|
it may overflow indirection_table_mask is UINT16_MAX. Check if
|
||
|
|
indirection_table_mask is small enough before adding 1.
|
||
|
|
|
||
|
|
Fixes: 5907902 ("virtio-net: implement RSS configuration command")
|
||
|
|
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
|
||
|
|
Signed-off-by: Jason Wang <jasowang@redhat.com>
|
||
|
|
Signed-off-by: zhangchujun <zhangchujun_yewu@cmss.chinamobile.com>
|
||
|
|
---
|
||
|
|
hw/net/virtio-net.c | 12 ++++++------
|
||
|
|
1 file changed, 6 insertions(+), 6 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
|
||
|
|
index 432c433540..d5008b65ec 100644
|
||
|
|
--- a/hw/net/virtio-net.c
|
||
|
|
+++ b/hw/net/virtio-net.c
|
||
|
|
@@ -1400,17 +1400,17 @@ static uint16_t virtio_net_handle_rss(VirtIONet *n,
|
||
|
|
n->rss_data.hash_types = virtio_ldl_p(vdev, &cfg.hash_types);
|
||
|
|
n->rss_data.indirections_len =
|
||
|
|
virtio_lduw_p(vdev, &cfg.indirection_table_mask);
|
||
|
|
- n->rss_data.indirections_len++;
|
||
|
|
if (!do_rss) {
|
||
|
|
- n->rss_data.indirections_len = 1;
|
||
|
|
+ n->rss_data.indirections_len = 0;
|
||
|
|
}
|
||
|
|
- if (!is_power_of_2(n->rss_data.indirections_len)) {
|
||
|
|
- err_msg = "Invalid size of indirection table";
|
||
|
|
+ if (n->rss_data.indirections_len >= VIRTIO_NET_RSS_MAX_TABLE_LEN) {
|
||
|
|
+ err_msg = "Too large indirection table";
|
||
|
|
err_value = n->rss_data.indirections_len;
|
||
|
|
goto error;
|
||
|
|
}
|
||
|
|
- if (n->rss_data.indirections_len > VIRTIO_NET_RSS_MAX_TABLE_LEN) {
|
||
|
|
- err_msg = "Too large indirection table";
|
||
|
|
+ n->rss_data.indirections_len++;
|
||
|
|
+ if (!is_power_of_2(n->rss_data.indirections_len)) {
|
||
|
|
+ err_msg = "Invalid size of indirection table";
|
||
|
|
err_value = n->rss_data.indirections_len;
|
||
|
|
goto error;
|
||
|
|
}
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|