From: Dakota Sicher <[email protected]>

ulp_mapper_blob_block_swap() used a variable-length array on the
stack sized by caller input for swap memory. Use a heap allocation
instead to avoid unbounded stack growth.

Fixes: dd0191d5e70d ("net/bnxt/tf_ulp: support Thor2 ULP layer")
Cc: [email protected]

Signed-off-by: Dakota Sicher <[email protected]>
Signed-off-by: Manish Kurup <[email protected]>
---
 drivers/net/bnxt/tf_ulp/ulp_mapper_tfc.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/net/bnxt/tf_ulp/ulp_mapper_tfc.c 
b/drivers/net/bnxt/tf_ulp/ulp_mapper_tfc.c
index 2d89f10d5e..934634c606 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_mapper_tfc.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_mapper_tfc.c
@@ -388,9 +388,8 @@ static const char * const mpc_error_str[] = {
 static int32_t
 ulp_mapper_blob_block_swap(struct ulp_blob *blob, uint32_t block_sz)
 {
-       uint8_t data[block_sz]; /* size of a block for temp storage */
        uint16_t num_words, data_sz;
-       uint8_t *pdata;
+       uint8_t *pdata, *data;
        int i;
 
        /* Shouldn't happen since it is internal function, but check anyway */
@@ -407,6 +406,12 @@ ulp_mapper_blob_block_swap(struct ulp_blob *blob, uint32_t 
block_sz)
                return -EINVAL;
        }
 
+       data = rte_zmalloc(NULL, block_sz, 0);
+       if (unlikely(!data)) {
+               BNXT_DRV_DBG(ERR, "Failed to allocate swap buffer");
+               return -ENOMEM;
+       }
+
        num_words = data_sz / block_sz;
        for (i = 0; i < num_words / 2; i++) {
                memcpy(data, &pdata[i * block_sz], block_sz);
@@ -415,6 +420,7 @@ ulp_mapper_blob_block_swap(struct ulp_blob *blob, uint32_t 
block_sz)
                memcpy(&pdata[(num_words - 1 - i) * block_sz],
                       data, block_sz);
        }
+       rte_free(data);
        return 0;
 }
 
-- 
2.31.1

Reply via email to