Skip to content

Commit

Permalink
dpif-netdev: Fix memory leak in tunnel header pop action.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
pshelar committed May 19, 2016
1 parent 1895cc8 commit 9235b47
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 17 deletions.
21 changes: 8 additions & 13 deletions lib/dpif-netdev.c
Expand Up @@ -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;
}
}
Expand Down
7 changes: 4 additions & 3 deletions lib/netdev.c
Expand Up @@ -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++) {
Expand All @@ -747,7 +749,6 @@ netdev_pop_header(struct netdev *netdev, struct dp_packet_batch *batch)
}
}
batch->count = n_cnt;
return 0;
}

int
Expand Down
2 changes: 1 addition & 1 deletion lib/netdev.h
Expand Up @@ -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);
Expand Down

0 comments on commit 9235b47

Please sign in to comment.