|WARNING| [v9,5/5] net/mlx5: accept more unicast MAC addresses

dpdklab at iol.unh.edu dpdklab at iol.unh.edu
Thu Sep 24 09:04:39 CEST 2026


Test-Label: ai-code-review
Test-Status: WARNING
https://dpdk.org/patch/169976

_AI Code Review_

=== Patch Review: series.patch (via Claude) ===
Review date: 2026-09-24

# DPDK Patch Review

## Patch 1/5: net/mlx5: remove MAC addresses flush helper on Linux

**No issues found.**

---

## Patch 2/5: net/mlx5: remove redundant MAC address index checks

**No issues found.**

---

## Patch 3/5: net/mlx5: pass maximum number of unicast MAC to common code

### Errors

**Resource leak on error path:**
In `mlx5_nl_mac_addr_sync()`, when `calloc()` succeeds but `mlx5_nl_mac_addr_list()` fails, the function returns early via `goto out` without freeing `macs`.
The `free(macs)` at the `out:` label will execute, so this is actually correct.
Wait--re-reading the code: the `goto out` on line 791 jumps to line 821, which does `free(macs)`.
This is correct.

Actually, I need to re-trace this more carefully.

```c
macs = calloc(n, sizeof(macs[0]));
if (macs == NULL)
	goto out;              // line ~787, macs is NULL

ret = mlx5_nl_mac_addr_list(nlsk_fd, iface_idx, &macs, &macs_n);
if (ret)
	goto out;              // line 791, macs is non-NULL, will be freed
```

At line 821, `free(macs)` is called. `free(NULL)` is safe, and if `macs != NULL` it is freed. This is correct.

**No resource leak.**

---

## Patch 4/5: net/mlx5: use bitset for tracking MAC addresses

**No issues found.**

---

## Patch 5/5: net/mlx5: accept more unicast MAC addresses

### Errors

**Potential use-after-free in error path cleanup:**

In `mlx5_dev_spawn()` (linux/mlx5_os.c), the error path at line 1994 does:

```c
mlx5_free(priv->mac);
mlx5_free(priv->mac_own);
mlx5_free(priv);
if (eth_dev != NULL) {
	eth_dev->data->mac_addrs = NULL;
	eth_dev->data->dev_private = NULL;
}
```

However, `eth_dev->data->mac_addrs` was set to `priv->mac` at line 1502 (in the original code, now line ~1510 after this patch adds the allocation).
After `mlx5_free(priv->mac)`, `eth_dev->data->mac_addrs` becomes a dangling pointer until it is set to NULL.

If any code between the `mlx5_free(priv->mac)` and the NULL assignment dereferences `eth_dev->data->mac_addrs`, this would be a use-after-free.

The correct order is:

```c
if (eth_dev != NULL) {
	eth_dev->data->mac_addrs = NULL;
	eth_dev->data->dev_private = NULL;
}
mlx5_free(priv->mac);
mlx5_free(priv->mac_own);
mlx5_free(priv);
```

This way, `eth_dev->data->mac_addrs` is set to NULL before the backing memory is freed, preventing any window where it is a dangling pointer.

**Same issue in Windows version:**
The Windows `mlx5_dev_spawn()` at lines 641-649 has the same pattern:

```c
mlx5_free(priv->mac);
mlx5_free(priv->mac_own);
mlx5_free(priv);
if (eth_dev != NULL) {
	eth_dev->data->mac_addrs = NULL;
	eth_dev->data->dev_private = NULL;
}
```

Same fix applies: NULL the pointer before freeing the memory.

---

### Warnings

**Release notes could be more specific about devlink configuration:**

The release note says "depending on devlink configuration" but does not mention that the user must set `max_macs` via devlink and reload the device.
The commit message provides the exact devlink commands, but the release note does not.

Consider adding a brief note or reference to documentation on how to configure this.

---

## Summary

### Patch 1/5:  Clean
### Patch 2/5:  Clean
### Patch 3/5:  Clean
### Patch 4/5:  Clean
### Patch 5/5:

**Errors:**
1. **Use-after-free risk in error path (Linux):** `mlx5_free(priv->mac)` is called before setting `eth_dev->data->mac_addrs = NULL`, leaving a dangling pointer window. Set `eth_dev->data->mac_addrs = NULL` **before** calling `mlx5_free(priv->mac)`.

2. **Use-after-free risk in error path (Windows):** Same issue in `windows/mlx5_os.c`. Set `eth_dev->data->mac_addrs = NULL` **before** calling `mlx5_free(priv->mac)`.

**Warnings:**
3. Release notes could include a reference to the devlink configuration steps or link to documentation.

---

**Suggested fix for errors 1 and 2:**

```c
/* linux/mlx5_os.c and windows/mlx5_os.c, error path */
if (eth_dev != NULL) {
	eth_dev->data->mac_addrs = NULL;
	eth_dev->data->dev_private = NULL;
}
mlx5_free(priv->mac);
mlx5_free(priv->mac_own);
mlx5_free(priv);
```


More information about the test-report mailing list