Move release to _odp_packet_classifier(), because caller has no way to
know if new_pkt were allocated. In that case there would be a double free
on pkt, and new_pkt would be leaked.

Signed-off-by: Zoltan Kiss <[email protected]>
---
 platform/linux-generic/odp_classification.c | 21 ++++++++++++---------
 platform/linux-generic/pktio/loop.c         |  1 -
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/platform/linux-generic/odp_classification.c 
b/platform/linux-generic/odp_classification.c
index 3a18a78..a1466fd 100644
--- a/platform/linux-generic/odp_classification.c
+++ b/platform/linux-generic/odp_classification.c
@@ -734,22 +734,20 @@ int _odp_packet_classifier(pktio_entry_t *entry, 
odp_packet_t pkt)
        odp_packet_t new_pkt;
        uint8_t *pkt_addr;
 
-       if (entry == NULL)
+       if (entry == NULL) {
+               odp_packet_free(pkt);
                return -1;
+       }
 
        pkt_hdr = odp_packet_hdr(pkt);
        pkt_addr = odp_packet_data(pkt);
 
        /* Matching PMR and selecting the CoS for the packet*/
        cos = pktio_select_cos(entry, pkt_addr, pkt_hdr);
-       if (cos == NULL)
-               return -1;
-
-       if (cos->s.pool == NULL)
-               return -1;
-
-       if (cos->s.queue == NULL)
+       if (cos == NULL || cos->s.queue == NULL || cos->s.pool == NULL) {
+               odp_packet_free(pkt);
                return -1;
+       }
 
        if (odp_packet_pool(pkt) != cos->s.pool->s.pool_hdl) {
                new_pkt = odp_packet_copy(pkt, cos->s.pool->s.pool_hdl);
@@ -762,7 +760,12 @@ int _odp_packet_classifier(pktio_entry_t *entry, 
odp_packet_t pkt)
 
        /* Enqueuing the Packet based on the CoS */
        queue = cos->s.queue;
-       return queue_enq(queue, odp_buf_to_hdr((odp_buffer_t)new_pkt), 0);
+       if (queue_enq(queue, odp_buf_to_hdr((odp_buffer_t)new_pkt), 0)) {
+               odp_packet_free(new_pkt);
+               return -1;
+       } else {
+               return 0;
+       }
 }
 
 cos_t *pktio_select_cos(pktio_entry_t *entry, const uint8_t *pkt_addr,
diff --git a/platform/linux-generic/pktio/loop.c 
b/platform/linux-generic/pktio/loop.c
index f6a8c1d..676e98b 100644
--- a/platform/linux-generic/pktio/loop.c
+++ b/platform/linux-generic/pktio/loop.c
@@ -76,7 +76,6 @@ static int loopback_recv(pktio_entry_t *pktio_entry, 
odp_packet_t pkts[],
                        } else {
                                pktio_entry->s.stats.in_errors +=
                                        odp_packet_len(pkt);
-                               odp_packet_free(pkt);
                        }
                }
                nbr = j;
-- 
1.9.1

_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to