|WARNING| [v3,3/3] net/txgbe: fix FDIR error handling on flow create

dpdklab at iol.unh.edu dpdklab at iol.unh.edu
Thu Sep 17 18:44:08 CEST 2026


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

_AI Code Review_

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

# DPDK Patch Review

## PATCH 1/3: net/txgbe: fix L2 tunnel error on flow create

### Errors

None.

### Warnings

None.

### Info

None.

**Summary:** Patch correctly adds missing error path handling after L2 tunnel filter failure. The `goto out` ensures the function returns an error instead of continuing to RSS parsing, matching the pattern used for ethertype and SYN filter failures.

---

## PATCH 2/3: net/txgbe: fix leak of filters on flow create

### Errors

1. **FDIR mask-only rule acceptance without allocation cleanup (line 3433)**

   The patch adds allocation before the mask/spec processing, but the logic flow has a problem: when `fdir_rule.b_spec` is false (mask-only rule), the code will `rte_free(fdir_rule_ptr)` and `goto out` at line 3433. However, if `fdir_rule.b_mask` was true and this was the first mask (`first_mask == TRUE`), the global mask has already been committed to hardware at line 3382 (`fdir_info->mask_added = TRUE`). A failed create should not leave the mask installed.

   **Fix:** Move the `if (!fdir_rule.b_spec)` check to before the `if (fdir_rule.b_mask)` block, so a mask-only rule is rejected before any hardware programming occurs.

   ```c
   /* Check for spec before processing mask */
   if (!fdir_rule.b_spec) {
       rte_free(fdir_rule_ptr);
       ret = -EINVAL;
       goto out;
   }
   
   /* A mask cannot be deleted. */
   if (fdir_rule.b_mask) {
       /* ... existing mask handling ... */
   }
   ```

2. **Missing errno assignment on flex offset mismatch (line 3401)**

   When the flex bytes offset or relative flag mismatches with the existing global state, the code performs `rte_free(fdir_rule_ptr)` and `goto out` (lines 3404-3406) but does not set `ret` to a negative errno. The `out` label calls `rte_flow_error_set(error, -ret, ...)`, so leaving `ret = 0` causes the application to see success (errno 0) on what should be a failure.

   **Fix:** Set `ret = -EINVAL` before the `rte_free` and `goto`.

   ```c
   if (fdir_info->flex_bytes_offset !=
       fdir_rule.flex_bytes_offset ||
       fdir_info->flex_relative !=
       fdir_rule.flex_relative) {
       rte_free(fdir_rule_ptr);
       ret = -EINVAL;
       goto out;
   }
   ```

3. **Missing errno assignment on global mask mismatch (line 3388)**

   The `memcmp` return value is stored in `ret` (line 3391), then if non-zero, the code logs an error, frees the pointer, and goes to `out`. But `memcmp` returns an arbitrary non-zero value on mismatch, not a negative errno. The application will see an undefined positive errno value instead of `EINVAL`.

   **Fix:** Do not store `memcmp`'s return in `ret`. Check the comparison result inline and set `ret = -EINVAL` on mismatch.

   ```c
   if (memcmp(&fdir_info->mask,
       &fdir_rule.mask,
       sizeof(struct txgbe_hw_fdir_mask)) != 0) {
       PMD_DRV_LOG(ERR, "only support one global mask");
       rte_free(fdir_rule_ptr);
       ret = -EINVAL;
       goto out;
   }
   ```

### Warnings

None.

### Info

None.

**Summary:** The patch correctly fixes resource leaks by allocating software copies before hardware programming and freeing on failure. However, three error paths fail to set `ret` to a negative errno, causing `rte_flow_error_set(error, -ret, ...)` to report success or a garbage errno. Additionally, a mask-only rule can leave the global input mask committed when it should be rejected before mask installation.

---

## PATCH 3/3: net/txgbe: fix FDIR error handling on flow create

### Errors

None (the patch fixes the errno issues identified in Patch 2/3).

### Warnings

1. **Duplicate fix attempt**

   This patch sets `ret = -EINVAL` on the flex offset mismatch and global mask mismatch paths, and adds the `if (!fdir_rule.b_spec)` check before mask processing. However, **Patch 2/3 already introduced these code paths without the errno assignments and the mask-only rejection**. Patch 3/3 is correcting bugs that Patch 2/3 introduced.

   The series would be cleaner if Patch 2/3 included the errno assignments and the spec check from the start, avoiding the need for Patch 3/3 to fix them.

   **Suggested approach:** Squash Patch 3/3 into Patch 2/3 so the leak fix does not introduce new errno bugs that are immediately corrected in the next patch.

### Info

None.

**Summary:** This patch correctly sets `ret = -EINVAL` on error paths that Patch 2/3 left with `ret = 0` or `ret = memcmp(...)`. It also correctly rejects mask-only rules before mask installation. However, the series structure introduces bugs in Patch 2/3 that are fixed in Patch 3/3; squashing them would avoid this.

---

## Overall Series Assessment

**Correctness:** After all three patches, the code is correct. Resources are allocated before hardware programming and freed on failure, and all error paths set a negative errno.

**Series structure issue:** Patch 2/3 introduces errno handling bugs (missing `-EINVAL` on mismatch paths, mask committed before rejecting mask-only rule) that Patch 3/3 fixes. It would be better to squash Patch 3/3 into Patch 2/3 so the leak fix does not transiently break errno reporting.

**Code style:** All patches comply with DPDK coding standards.


More information about the test-report mailing list