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
