hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/drivers/net/ethernet/ibm/ibmvnic.c
....@@ -929,12 +929,22 @@
929929
930930 static void release_login_buffer(struct ibmvnic_adapter *adapter)
931931 {
932
+ if (!adapter->login_buf)
933
+ return;
934
+
935
+ dma_unmap_single(&adapter->vdev->dev, adapter->login_buf_token,
936
+ adapter->login_buf_sz, DMA_TO_DEVICE);
932937 kfree(adapter->login_buf);
933938 adapter->login_buf = NULL;
934939 }
935940
936941 static void release_login_rsp_buffer(struct ibmvnic_adapter *adapter)
937942 {
943
+ if (!adapter->login_rsp_buf)
944
+ return;
945
+
946
+ dma_unmap_single(&adapter->vdev->dev, adapter->login_rsp_buf_token,
947
+ adapter->login_rsp_buf_sz, DMA_FROM_DEVICE);
938948 kfree(adapter->login_rsp_buf);
939949 adapter->login_rsp_buf = NULL;
940950 }
....@@ -3861,11 +3871,14 @@
38613871 if (rc) {
38623872 adapter->login_pending = false;
38633873 netdev_err(adapter->netdev, "Failed to send login, rc=%d\n", rc);
3864
- goto buf_rsp_map_failed;
3874
+ goto buf_send_failed;
38653875 }
38663876
38673877 return 0;
38683878
3879
+buf_send_failed:
3880
+ dma_unmap_single(dev, rsp_buffer_token, rsp_buffer_size,
3881
+ DMA_FROM_DEVICE);
38693882 buf_rsp_map_failed:
38703883 kfree(login_rsp_buffer);
38713884 adapter->login_rsp_buf = NULL;
....@@ -4430,6 +4443,7 @@
44304443 int num_tx_pools;
44314444 int num_rx_pools;
44324445 u64 *size_array;
4446
+ u32 rsp_len;
44334447 int i;
44344448
44354449 /* CHECK: Test/set of login_pending does not need to be atomic
....@@ -4440,11 +4454,6 @@
44404454 return 0;
44414455 }
44424456 adapter->login_pending = false;
4443
-
4444
- dma_unmap_single(dev, adapter->login_buf_token, adapter->login_buf_sz,
4445
- DMA_TO_DEVICE);
4446
- dma_unmap_single(dev, adapter->login_rsp_buf_token,
4447
- adapter->login_rsp_buf_sz, DMA_FROM_DEVICE);
44484457
44494458 /* If the number of queues requested can't be allocated by the
44504459 * server, the login response will return with code 1. We will need
....@@ -4481,6 +4490,23 @@
44814490 ibmvnic_reset(adapter, VNIC_RESET_FATAL);
44824491 return -EIO;
44834492 }
4493
+
4494
+ rsp_len = be32_to_cpu(login_rsp->len);
4495
+ if (be32_to_cpu(login->login_rsp_len) < rsp_len ||
4496
+ rsp_len <= be32_to_cpu(login_rsp->off_txsubm_subcrqs) ||
4497
+ rsp_len <= be32_to_cpu(login_rsp->off_rxadd_subcrqs) ||
4498
+ rsp_len <= be32_to_cpu(login_rsp->off_rxadd_buff_size) ||
4499
+ rsp_len <= be32_to_cpu(login_rsp->off_supp_tx_desc)) {
4500
+ /* This can happen if a login request times out and there are
4501
+ * 2 outstanding login requests sent, the LOGIN_RSP crq
4502
+ * could have been for the older login request. So we are
4503
+ * parsing the newer response buffer which may be incomplete
4504
+ */
4505
+ dev_err(dev, "FATAL: Login rsp offsets/lengths invalid\n");
4506
+ ibmvnic_reset(adapter, VNIC_RESET_FATAL);
4507
+ return -EIO;
4508
+ }
4509
+
44844510 size_array = (u64 *)((u8 *)(adapter->login_rsp_buf) +
44854511 be32_to_cpu(adapter->login_rsp_buf->off_rxadd_buff_size));
44864512 /* variable buffer sizes are not supported, so just read the