Skip to content

Commit 3a4aa3c

Browse files
GavinLi-NVkuba-moo
authored andcommitted
net/mlx5e: fix double free of encap_header in update funcs
Follow up to the previous patch to fix the same issue for mlx5e_tc_tun_update_header_ipv4{6} when mlx5_packet_reformat_alloc() fails. When mlx5_packet_reformat_alloc() fails, the encap_header allocated in mlx5e_tc_tun_update_header_ipv4{6} will be released within it. However, e->encap_header is already set to the previously freed encap_header before mlx5_packet_reformat_alloc(). As a result, the later mlx5e_encap_put() will free e->encap_header again, causing a double free issue. mlx5e_encap_put() --> mlx5e_encap_dealloc() --> kfree(e->encap_header) This patch fix it by not setting e->encap_header until mlx5_packet_reformat_alloc() success. Fixes: a54e20b ("net/mlx5e: Add basic TC tunnel set action for SRIOV offloads") Signed-off-by: Gavin Li <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 6f9b1a0 commit 3a4aa3c

File tree

1 file changed

+10
-10
lines changed
  • drivers/net/ethernet/mellanox/mlx5/core/en

1 file changed

+10
-10
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -403,16 +403,12 @@ int mlx5e_tc_tun_update_header_ipv4(struct mlx5e_priv *priv,
403403
if (err)
404404
goto free_encap;
405405

406-
e->encap_size = ipv4_encap_size;
407-
kfree(e->encap_header);
408-
e->encap_header = encap_header;
409-
410406
if (!(nud_state & NUD_VALID)) {
411407
neigh_event_send(attr.n, NULL);
412408
/* the encap entry will be made valid on neigh update event
413409
* and not used before that.
414410
*/
415-
goto release_neigh;
411+
goto free_encap;
416412
}
417413

418414
memset(&reformat_params, 0, sizeof(reformat_params));
@@ -426,6 +422,10 @@ int mlx5e_tc_tun_update_header_ipv4(struct mlx5e_priv *priv,
426422
goto free_encap;
427423
}
428424

425+
e->encap_size = ipv4_encap_size;
426+
kfree(e->encap_header);
427+
e->encap_header = encap_header;
428+
429429
e->flags |= MLX5_ENCAP_ENTRY_VALID;
430430
mlx5e_rep_queue_neigh_stats_work(netdev_priv(attr.out_dev));
431431
mlx5e_route_lookup_ipv4_put(&attr);
@@ -669,16 +669,12 @@ int mlx5e_tc_tun_update_header_ipv6(struct mlx5e_priv *priv,
669669
if (err)
670670
goto free_encap;
671671

672-
e->encap_size = ipv6_encap_size;
673-
kfree(e->encap_header);
674-
e->encap_header = encap_header;
675-
676672
if (!(nud_state & NUD_VALID)) {
677673
neigh_event_send(attr.n, NULL);
678674
/* the encap entry will be made valid on neigh update event
679675
* and not used before that.
680676
*/
681-
goto release_neigh;
677+
goto free_encap;
682678
}
683679

684680
memset(&reformat_params, 0, sizeof(reformat_params));
@@ -692,6 +688,10 @@ int mlx5e_tc_tun_update_header_ipv6(struct mlx5e_priv *priv,
692688
goto free_encap;
693689
}
694690

691+
e->encap_size = ipv6_encap_size;
692+
kfree(e->encap_header);
693+
e->encap_header = encap_header;
694+
695695
e->flags |= MLX5_ENCAP_ENTRY_VALID;
696696
mlx5e_rep_queue_neigh_stats_work(netdev_priv(attr.out_dev));
697697
mlx5e_route_lookup_ipv6_put(&attr);

0 commit comments

Comments
 (0)