|WARNING| net/txgbe: fix use-after-free in flow destroy
dpdklab at iol.unh.edu
dpdklab at iol.unh.edu
Thu Sep 10 16:02:14 CEST 2026
Test-Label: ai-code-review
Test-Status: WARNING
https://dpdk.org/patch/169365
_AI Code Review_
=== Patch Review: series.patch (via Claude) ===
Review date: 2026-09-10
# DPDK Patch Review
## Summary
This patch fixes a use-after-free bug in the txgbe driver's flow destroy function. The issue occurs when iterating over a TAILQ while removing and freeing nodes inside the loop.
---
## Errors
### 1. NULL pointer check condition is wrong (correctness bug)
**Problem:** After the `TAILQ_FOREACH` loop exits, `txgbe_flow_mem_ptr` will be `NULL` if the flow was not found. However, it will ALSO be `NULL` if the loop completes normally by walking past the last entry. The check `if (txgbe_flow_mem_ptr != NULL)` does not distinguish "found" from "walked past end of list".
**Why it matters:** This creates a correctness bug where if the flow is not in the list, the code proceeds to `TAILQ_REMOVE` with a NULL pointer, which is undefined behavior.
**Suggested fix:** After the loop, the pointer is NULL if the flow was not found. Check explicitly that we found the entry before attempting removal:
```c
TAILQ_FOREACH(txgbe_flow_mem_ptr, &txgbe_flow_list, entries) {
if (txgbe_flow_mem_ptr->flow == pmd_flow)
break;
}
if (txgbe_flow_mem_ptr == NULL) {
/* Flow not found in tracking list - this should not happen
* but handle gracefully */
rte_free(flow);
return 0;
}
TAILQ_REMOVE(&txgbe_flow_list, txgbe_flow_mem_ptr, entries);
rte_free(txgbe_flow_mem_ptr);
rte_free(flow);
return 0;
```
Alternatively, use `TAILQ_FOREACH_SAFE` to avoid the entire issue:
```c
struct txgbe_flow_mem *txgbe_flow_mem_ptr, *tmp;
TAILQ_FOREACH_SAFE(txgbe_flow_mem_ptr, &txgbe_flow_list, entries, tmp) {
if (txgbe_flow_mem_ptr->flow == pmd_flow) {
TAILQ_REMOVE(&txgbe_flow_list, txgbe_flow_mem_ptr, entries);
rte_free(txgbe_flow_mem_ptr);
break;
}
}
```
---
## Info
### 1. The original use-after-free fix is correct
The patch correctly identifies that the original code removed and freed nodes inside a `TAILQ_FOREACH` loop, which would cause the next iteration to dereference freed memory. The fix to search first, then remove after the loop, is a valid approach to this problem.
---
## Notes
- The patch subject and commit message are clear and follow DPDK conventions (not reviewed per instructions)
- The `Fixes:` tag is present and references the introducing commit
- `Cc: stable at dpdk.org` is correctly included for backporting
- No style violations detected beyond the correctness issue above
- No forbidden tokens identified
- The patch does not introduce new API or require documentation updates
More information about the test-report
mailing list