The tunnel header pop action can leak batch of packet in case of error. Following patch fixex the error code path.
Signed-off-by: Pravin B Shelar <pshe...@ovn.org> --- lib/dpif-netdev.c | 21 ++++++++------------- lib/netdev.c | 7 ++++--- lib/netdev.h | 2 +- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 539e0c8..f0d5fca 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -3751,30 +3751,25 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, p = dp_netdev_lookup_port(dp, portno); if (p) { struct dp_packet_batch tnl_pkt; - int err; + int i; if (!may_steal) { dp_packet_batch_clone(&tnl_pkt, packets_); packets_ = &tnl_pkt; } - err = netdev_pop_header(p->netdev, packets_); + netdev_pop_header(p->netdev, packets_); if (!packets_->count) { return; } - if (!err) { - int i; - for (i = 0; i < packets_->count; i++) { - packets_->packets[i]->md.in_port.odp_port = portno; - } - - (*depth)++; - dp_netdev_recirculate(pmd, packets_); - (*depth)--; - } else { - dp_packet_delete_batch(&tnl_pkt, !may_steal); + for (i = 0; i < packets_->count; i++) { + packets_->packets[i]->md.in_port.odp_port = portno; } + + (*depth)++; + dp_netdev_recirculate(pmd, packets_); + (*depth)--; return; } } diff --git a/lib/netdev.c b/lib/netdev.c index 979f6f1..a83e53e 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -731,14 +731,16 @@ netdev_send(struct netdev *netdev, int qid, struct dp_packet_batch *batch, return error; } -int +void netdev_pop_header(struct netdev *netdev, struct dp_packet_batch *batch) { int i, n_cnt = 0; struct dp_packet **buffers = batch->packets; if (!netdev->netdev_class->pop_header) { - return EOPNOTSUPP; + dp_packet_delete_batch(batch, true); + batch->count = 0; + return; } for (i = 0; i < batch->count; i++) { @@ -748,7 +750,6 @@ netdev_pop_header(struct netdev *netdev, struct dp_packet_batch *batch) } } batch->count = n_cnt; - return 0; } int diff --git a/lib/netdev.h b/lib/netdev.h index 22e4209..a292167 100644 --- a/lib/netdev.h +++ b/lib/netdev.h @@ -158,7 +158,7 @@ int netdev_build_header(const struct netdev *, struct ovs_action_push_tnl *data, int netdev_push_header(const struct netdev *netdev, struct dp_packet_batch *, const struct ovs_action_push_tnl *data); -int netdev_pop_header(struct netdev *netdev, struct dp_packet_batch *); +void netdev_pop_header(struct netdev *netdev, struct dp_packet_batch *); /* Hardware address. */ int netdev_set_etheraddr(struct netdev *, const struct eth_addr mac); -- 2.5.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev