Commit 3e711c8e authored by Ihor Solodrai's avatar Ihor Solodrai Committed by Alexei Starovoitov
Browse files

selftests/bpf: Fix array bounds warning in jit_disasm_helpers



Compiler cannot infer upper bound for labels.cnt and warns about
potential buffer overflow in snprintf. Add an explicit bounds
check (... && i < MAX_LOCAL_LABELS) in the loop condition to fix the
warning.

Acked-by: default avatarEduard Zingerman <eddyz87@gmail.com>
Signed-off-by: default avatarIhor Solodrai <ihor.solodrai@linux.dev>
Link: https://lore.kernel.org/r/20260223190736.649171-18-ihor.solodrai@linux.dev


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 2bb270a0
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -122,15 +122,15 @@ static int disasm_one_func(FILE *text_out, uint8_t *image, __u32 len)
		pc += cnt;
	}
	qsort(labels.pcs, labels.cnt, sizeof(*labels.pcs), cmp_u32);
	for (i = 0; i < labels.cnt; ++i)
		/* gcc is unable to infer upper bound for labels.cnt and assumes
		 * it to be U32_MAX. U32_MAX takes 10 decimal digits.
		 * snprintf below prints into labels.names[*],
		 * which has space only for two digits and a letter.
		 * To avoid truncation warning use (i % MAX_LOCAL_LABELS),
		 * which informs gcc about printed value upper bound.
	/* gcc is unable to infer upper bound for labels.cnt and
	 * assumes it to be U32_MAX. U32_MAX takes 10 decimal digits.
	 * snprintf below prints into labels.names[*], which has space
	 * only for two digits and a letter.  To avoid truncation
	 * warning use (i < MAX_LOCAL_LABELS), which informs gcc about
	 * printed value upper bound.
	 */
		snprintf(labels.names[i], sizeof(labels.names[i]), "L%d", i % MAX_LOCAL_LABELS);
	for (i = 0; i < labels.cnt && i < MAX_LOCAL_LABELS; ++i)
		snprintf(labels.names[i], sizeof(labels.names[i]), "L%d", i);

	/* now print with labels */
	labels.print_phase = true;