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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user