From: Jie Liu <[email protected]>

sxe2_tx_queue_mbufs_release_vec() calls rte_pktmbuf_free_seg() on each
buffer entry without checking for NULL. rte_pktmbuf_free_seg() does not
tolerate NULL and dereferences its argument, so a stop/start cycle or
any unwritten slot in the release range can crash.

Restore the NULL check before freeing each mbuf.

Cc: [email protected]
Cc: [email protected]
Signed-off-by: Jie Liu <[email protected]>
---
 drivers/net/sxe2/sxe2_txrx_vec.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/net/sxe2/sxe2_txrx_vec.c b/drivers/net/sxe2/sxe2_txrx_vec.c
index 05940c8cb5..7c5da33dd5 100644
--- a/drivers/net/sxe2/sxe2_txrx_vec.c
+++ b/drivers/net/sxe2/sxe2_txrx_vec.c
@@ -183,15 +183,19 @@ static void sxe2_tx_queue_mbufs_release_vec(struct 
sxe2_tx_queue *txq)
 
        if (txq->next_use < i) {
                for ( ; i < txq->ring_depth; ++i) {
-                       rte_pktmbuf_free_seg(buffer_vec[i].mbuf);
-                       buffer_vec[i].mbuf = NULL;
+                       if (buffer_vec[i].mbuf != NULL) {
+                               rte_pktmbuf_free_seg(buffer_vec[i].mbuf);
+                               buffer_vec[i].mbuf = NULL;
+                       }
                }
                i = 0;
        }
 
        for ( ; i < txq->next_use; ++i) {
-               rte_pktmbuf_free_seg(buffer_vec[i].mbuf);
-               buffer_vec[i].mbuf = NULL;
+               if (buffer_vec[i].mbuf != NULL) {
+                       rte_pktmbuf_free_seg(buffer_vec[i].mbuf);
+                       buffer_vec[i].mbuf = NULL;
+               }
        }
 }
 
-- 
2.52.0

Reply via email to