2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-11 13:57:52 +00:00

dpif-netdev: Fix memory leak in tunnel header pop action.

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 <pshelar@ovn.org>
Acked-by: Jesse Gross <jesse@kernel.org>
This commit is contained in:
Pravin B Shelar
2016-05-17 17:32:37 -07:00
parent 1895cc8dbb
commit 9235b4793e
3 changed files with 13 additions and 17 deletions

View File

@@ -3751,19 +3751,17 @@ 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;
@@ -3772,9 +3770,6 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_,
(*depth)++;
dp_netdev_recirculate(pmd, packets_);
(*depth)--;
} else {
dp_packet_delete_batch(&tnl_pkt, !may_steal);
}
return;
}
}

View File

@@ -730,14 +730,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++) {
@@ -747,7 +749,6 @@ netdev_pop_header(struct netdev *netdev, struct dp_packet_batch *batch)
}
}
batch->count = n_cnt;
return 0;
}
int

View File

@@ -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);