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

Reply via email to