Re: [PATCH v2 00/14] common/sfc_efx/base: fix code analysis issues

Stephen Hemminger <[email protected]>
Newsgroups org.dpdk.dev
Message-ID <[email protected]>
On Wed, 12 Aug 2026 21:08:20 +0400
Ivan Malov <[email protected]> wrote:

> This series addresses code analysis defects in the
> common/sfc_efx/base library.
> 
> The first four patches fix excessive stack consumption in
> MCDI helper functions, each exceeding 1 KB on-stack, by
> switching to heap-allocated payload buffers.
> 
> The remaining ten patches correct SAL annotations, add NULL
> checks across netport and filter helpers, resolving
> uninitialised memory, buffer overrun, and potential
> dereference issues. The final patch widens loop
> variable types to address a CodeQL warning.
> 
> 
> v2:
> 
> - note for the future AI reviews: apply this on top of
>   the 'next-net-main' branch


Still has AI review issues.

Reviewed v2 applied on c1a46b9 ("doc: remove unreferenced KNI and
examples figures"). All 14 apply cleanly. Comparing commit contents
against v1, only patches 11 and 13 have real changes; 12 differs only
in hunk offsets.

Addressed since v1, all correct as far as I can tell:

 - 11/14 now reads MORE_ENTRIES with MCDI_OUT_DWORD_FIELD against
   MAC_STATISTICS_DESCRIPTOR_OUT_FLAGS, so only LBN 0 is tested.
 - 13/14 adds matched_mask so *enum_hwp is written only on the first
   match per SW flag. That restores the original selection order that
   the removed "mask_sw &= ~(flag_sw)" used to provide, including the
   case where several distinct SW flags are set.
 - 13/14 passes cap_enum_hw rather than MC_CMD_FEC_AUTO as the default,
   so a request with no FEC bits keeps MC_CMD_FEC_NONE.
 - __success() placement is now consistent between 09/14 and 13/14.

Patch 11/14: common/sfc_efx/base: fix flex array in netport stat describe

Error: count and stride are still used to index the response buffer with
no bound derived from the response length. This was the main finding on
v1 and is unchanged:

	stride = MCDI_OUT_DWORD(req, MAC_STATISTICS_DESCRIPTOR_OUT_ENTRY_SIZE);
	count = MCDI_OUT_DWORD(req, MAC_STATISTICS_DESCRIPTOR_OUT_ENTRY_COUNT);
	...
		for (i = 0; i < count; ++i) {
			efx_np_stat_describe(entries + i * stride,

Both fields come from firmware. entries points at payload + 20 in a
1020-byte allocation and efx_np_stat_describe() reads 8 bytes per entry,
so any count above (out_sz - 20) / stride reads bytes that were never
written, and count * stride above 1000 reads past the end of the
allocation. The old ENTRIES_NUM(out_sz) expression was wrong for
stride > 8, as the commit message says, but it did bound the loop by the
data actually received; nothing replaces that bound.

	if (stride < MC_CMD_STAT_DESC_LEN ||
	    count > (out_sz -
		     MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_OFST) /
		    stride) {
		rc = EMSGSIZE;
		goto fail4;
	}

The stride test has to come first, otherwise stride == 0 divides by
zero.

Patch 13/14: common/sfc_efx/base: rework SW mask to HW enum converter

Warning: In the fixed-link branch the programmed technology still
changes. link_tech is initialised to MC_CMD_ETH_TECH_NONE and previously
stayed NONE when no requested tech bit was present in the map; passing
MC_CMD_ETH_TECH_AUTO as enum_hw_def now overwrites it. Unlike the FEC
call, which v2 changed to pass the pre-computed value, this one keeps
the hardcoded default. That may well be the intent, but the commit
message is unchanged from v1 and still describes the patch only as a
refactor plus annotation fix; it does not mention the new enum_hw_def
parameter or this behaviour change. Please say so in the commit message,
or pass link_tech to keep the old value.

Patch 01-04: common/sfc_efx/base: reduce stack in ...

Info: Unchanged from v1, repeating for the record. The four conversions
open-code MAX(IN_LEN, OUT_LEN) where EFX_MCDI_BUF_SIZE() exists and also
rounds up to a dword multiple and enforces a two-dword minimum. The
rounding matters because ef10_mcdi_send_request() reads the payload a
full dword at a time. All four current lengths are dword multiples so
there is no defect today, but the property is lost for future length
changes.

Patch 05/14: common/sfc_efx/base: fix filter saved spec handling

Info: Unchanged from v1. Both added NULL checks are unreachable:
saved_spec == NULL forces EF10_FILTER_ADD_NEW in
ef10_filter_add_select_action(), so ADD_STORE and ADD_REPLACE both imply
a non-NULL saved_spec. The __in_opt annotations are right; the STORE
branch already asserts its sibling invariant one line above, so
EFSYS_ASSERT(saved_spec != NULL) would match local style rather than
silently skipping the efs_overridden_spec assignment.

Patch 09/14 and 13/14

Info: The two are consistent with each other now, but both put
__success() on its own line above "static". Existing uses in the tree
put it on the return type line, e.g. ef10_nvram.c:941

	__checkReturn	__success(return != B_FALSE)	boolean_t
	ef10_nvram_buffer_find_item(
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.