| From b2bc7815774ecddf7efe95caebef3c6a0eb222b0 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 5 Feb 2026 17:28:09 +0100 |
| Subject: myri10ge: avoid uninitialized variable use |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| [ Upstream commit fd24173439c033ffb3c2a2628fcbc9cb65e62bdb ] |
| |
| While compile testing on less common architectures, I noticed that gcc-10 on |
| s390 finds a bug that all other configurations seem to miss: |
| |
| drivers/net/ethernet/myricom/myri10ge/myri10ge.c: In function 'myri10ge_set_multicast_list': |
| drivers/net/ethernet/myricom/myri10ge/myri10ge.c:391:25: error: 'cmd.data0' is used uninitialized in this function [-Werror=uninitialized] |
| 391 | buf->data0 = htonl(data->data0); |
| | ^~ |
| drivers/net/ethernet/myricom/myri10ge/myri10ge.c:392:25: error: '*((void *)&cmd+4)' is used uninitialized in this function [-Werror=uninitialized] |
| 392 | buf->data1 = htonl(data->data1); |
| | ^~ |
| drivers/net/ethernet/myricom/myri10ge/myri10ge.c: In function 'myri10ge_allocate_rings': |
| drivers/net/ethernet/myricom/myri10ge/myri10ge.c:392:13: error: 'cmd.data1' is used uninitialized in this function [-Werror=uninitialized] |
| 392 | buf->data1 = htonl(data->data1); |
| drivers/net/ethernet/myricom/myri10ge/myri10ge.c:1939:22: note: 'cmd.data1' was declared here |
| 1939 | struct myri10ge_cmd cmd; |
| | ^~~ |
| drivers/net/ethernet/myricom/myri10ge/myri10ge.c:393:13: error: 'cmd.data2' is used uninitialized in this function [-Werror=uninitialized] |
| 393 | buf->data2 = htonl(data->data2); |
| drivers/net/ethernet/myricom/myri10ge/myri10ge.c:1939:22: note: 'cmd.data2' was declared here |
| 1939 | struct myri10ge_cmd cmd; |
| |
| It would be nice to understand how to make other compilers catch this as |
| well, but for the moment I'll just shut up the warning by fixing the |
| undefined behavior in this driver. |
| |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Link: https://patch.msgid.link/20260205162935.2126442-1-arnd@kernel.org |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../net/ethernet/myricom/myri10ge/myri10ge.c | 28 ++++++++++++++++++- |
| 1 file changed, 27 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c |
| index 5a1ed4818baac..28857053f7514 100644 |
| --- a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c |
| +++ b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c |
| @@ -688,6 +688,9 @@ static int myri10ge_get_firmware_capabilities(struct myri10ge_priv *mgp) |
| |
| /* probe for IPv6 TSO support */ |
| mgp->features = NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_TSO; |
| + cmd.data0 = 0, |
| + cmd.data1 = 0, |
| + cmd.data2 = 0, |
| status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE, |
| &cmd, 0); |
| if (status == 0) { |
| @@ -805,6 +808,7 @@ static int myri10ge_update_mac_address(struct myri10ge_priv *mgp, u8 * addr) |
| | (addr[2] << 8) | addr[3]); |
| |
| cmd.data1 = ((addr[4] << 8) | (addr[5])); |
| + cmd.data2 = 0; |
| |
| status = myri10ge_send_cmd(mgp, MXGEFW_SET_MAC_ADDRESS, &cmd, 0); |
| return status; |
| @@ -816,6 +820,9 @@ static int myri10ge_change_pause(struct myri10ge_priv *mgp, int pause) |
| int status, ctl; |
| |
| ctl = pause ? MXGEFW_ENABLE_FLOW_CONTROL : MXGEFW_DISABLE_FLOW_CONTROL; |
| + cmd.data0 = 0, |
| + cmd.data1 = 0, |
| + cmd.data2 = 0, |
| status = myri10ge_send_cmd(mgp, ctl, &cmd, 0); |
| |
| if (status) { |
| @@ -833,6 +840,9 @@ myri10ge_change_promisc(struct myri10ge_priv *mgp, int promisc, int atomic) |
| int status, ctl; |
| |
| ctl = promisc ? MXGEFW_ENABLE_PROMISC : MXGEFW_DISABLE_PROMISC; |
| + cmd.data0 = 0; |
| + cmd.data1 = 0; |
| + cmd.data2 = 0; |
| status = myri10ge_send_cmd(mgp, ctl, &cmd, atomic); |
| if (status) |
| netdev_err(mgp->dev, "Failed to set promisc mode\n"); |
| @@ -1938,6 +1948,8 @@ static int myri10ge_allocate_rings(struct myri10ge_slice_state *ss) |
| /* get ring sizes */ |
| slice = ss - mgp->ss; |
| cmd.data0 = slice; |
| + cmd.data1 = 0; |
| + cmd.data2 = 0; |
| status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_RING_SIZE, &cmd, 0); |
| tx_ring_size = cmd.data0; |
| cmd.data0 = slice; |
| @@ -2230,12 +2242,16 @@ static int myri10ge_get_txrx(struct myri10ge_priv *mgp, int slice) |
| status = 0; |
| if (slice == 0 || (mgp->dev->real_num_tx_queues > 1)) { |
| cmd.data0 = slice; |
| + cmd.data1 = 0; |
| + cmd.data2 = 0; |
| status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_OFFSET, |
| &cmd, 0); |
| ss->tx.lanai = (struct mcp_kreq_ether_send __iomem *) |
| (mgp->sram + cmd.data0); |
| } |
| cmd.data0 = slice; |
| + cmd.data1 = 0; |
| + cmd.data2 = 0; |
| status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SMALL_RX_OFFSET, |
| &cmd, 0); |
| ss->rx_small.lanai = (struct mcp_kreq_ether_recv __iomem *) |
| @@ -2304,6 +2320,7 @@ static int myri10ge_open(struct net_device *dev) |
| if (mgp->num_slices > 1) { |
| cmd.data0 = mgp->num_slices; |
| cmd.data1 = MXGEFW_SLICE_INTR_MODE_ONE_PER_SLICE; |
| + cmd.data2 = 0; |
| if (mgp->dev->real_num_tx_queues > 1) |
| cmd.data1 |= MXGEFW_SLICE_ENABLE_MULTIPLE_TX_QUEUES; |
| status = myri10ge_send_cmd(mgp, MXGEFW_CMD_ENABLE_RSS_QUEUES, |
| @@ -2406,6 +2423,8 @@ static int myri10ge_open(struct net_device *dev) |
| |
| /* now give firmware buffers sizes, and MTU */ |
| cmd.data0 = dev->mtu + ETH_HLEN + VLAN_HLEN; |
| + cmd.data1 = 0; |
| + cmd.data2 = 0; |
| status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_MTU, &cmd, 0); |
| cmd.data0 = mgp->small_bytes; |
| status |= |
| @@ -2464,7 +2483,6 @@ static int myri10ge_open(struct net_device *dev) |
| static int myri10ge_close(struct net_device *dev) |
| { |
| struct myri10ge_priv *mgp = netdev_priv(dev); |
| - struct myri10ge_cmd cmd; |
| int status, old_down_cnt; |
| int i; |
| |
| @@ -2483,8 +2501,13 @@ static int myri10ge_close(struct net_device *dev) |
| |
| netif_tx_stop_all_queues(dev); |
| if (mgp->rebooted == 0) { |
| + struct myri10ge_cmd cmd; |
| + |
| old_down_cnt = mgp->down_cnt; |
| mb(); |
| + cmd.data0 = 0; |
| + cmd.data1 = 0; |
| + cmd.data2 = 0; |
| status = |
| myri10ge_send_cmd(mgp, MXGEFW_CMD_ETHERNET_DOWN, &cmd, 0); |
| if (status) |
| @@ -2948,6 +2971,9 @@ static void myri10ge_set_multicast_list(struct net_device *dev) |
| |
| /* Disable multicast filtering */ |
| |
| + cmd.data0 = 0; |
| + cmd.data1 = 0; |
| + cmd.data2 = 0; |
| err = myri10ge_send_cmd(mgp, MXGEFW_ENABLE_ALLMULTI, &cmd, 1); |
| if (err != 0) { |
| netdev_err(dev, "Failed MXGEFW_ENABLE_ALLMULTI, error status: %d\n", |
| -- |
| 2.51.0 |
| |