From nobody Fri Apr 3 11:10:12 2026 Received: from out-182.mta0.migadu.com (out-182.mta0.migadu.com [91.218.175.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 338F9366544 for ; Fri, 20 Feb 2026 18:20:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611630; cv=none; b=caL/dy6FDDUiRB5K/3yIaV/TkPmCy/6bvs3WGVJvvcGzTkD+Tc69rFsLd8k2GxWaFeBiRSeulZFLLGWUOCg1Fui8TEIMOU9GWffUab+3V7fKCfhWqDENAe8cRJAFoW5F5N2dYSJcdmXaSgNYtPlJhDyJBJEbD6lqcFBq8JIaxaw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611630; c=relaxed/simple; bh=5rGPeJPf6w4YpvFN5Ca2c5lafn9ScyA2xpGvxTnzCmQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ju/YNPIEoW+S6P8jMM2SyHUnadyVXi0iHrrm6nKPLQgwIgLzPUl6YxHBWRMAAwGOv09Jj1d+MJ+1coP9jVyZL6MKFwLmpzPTEYRqrx2rBE1KqkrnAGnWE3ReYW8iKgEXKAXhTcxUYR8OD5FBJaEDiS1GhKmYcZN94PJKjRc22p0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=jMfe4WZS; arc=none smtp.client-ip=91.218.175.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="jMfe4WZS" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1771611626; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zM4hi2wr/55oi9+YRDxF/pe1IGahl9NLf8Kax2WDvcs=; b=jMfe4WZS/NXHkZAUUZl4D3nvFHAiNwZvy0H3NAgo6reMRtAYxpcgdk7nkX87w5c/ICr4Fi 9w+Rb0b+ge6LnFTcfKzzfx89DxOr66uKFKTo1nSYJekw84D0SN02ryTtNHswsh1b8cegUx WR+o716VgMubZxMQqkEQ5EdvhYpaJBI= From: Ihor Solodrai To: Alexei Starovoitov , Andrii Nakryiko , Daniel Borkmann , Eduard Zingerman Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH bpf v1 1/7] selftests/bpf: Add simple strscpy() implementation Date: Fri, 20 Feb 2026 10:20:05 -0800 Message-ID: <20260220182011.802116-2-ihor.solodrai@linux.dev> In-Reply-To: <20260220182011.802116-1-ihor.solodrai@linux.dev> References: <20260220182011.802116-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Replace bpf_strlcpy() in bpf_util.h with a sized_strscpy(), which is a simplified sized_strscpy() from the kernel (lib/string.c). It: * takes a count (destination size) parameter * guarantees NULL-termination * returns the number of characters copied or -E2BIG Re-define strscpy macro to sized_strscpy. Fixup the single existing bpf_strlcpy() call in cgroup_helpers.c Signed-off-by: Ihor Solodrai Suggested-by: Alexei Starovoitov --- tools/testing/selftests/bpf/bpf_util.h | 38 +++++++++++++------- tools/testing/selftests/bpf/cgroup_helpers.c | 2 +- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/tools/testing/selftests/bpf/bpf_util.h b/tools/testing/selftes= ts/bpf/bpf_util.h index 4bc2d25f33e1..8c95ef7ed7c0 100644 --- a/tools/testing/selftests/bpf/bpf_util.h +++ b/tools/testing/selftests/bpf/bpf_util.h @@ -21,25 +21,37 @@ static inline unsigned int bpf_num_possible_cpus(void) return possible_cpus; } =20 -/* Copy up to sz - 1 bytes from zero-terminated src string and ensure that= dst - * is zero-terminated string no matter what (unless sz =3D=3D 0, in which = case - * it's a no-op). It's conceptually close to FreeBSD's strlcpy(), but diff= ers - * in what is returned. Given this is internal helper, it's trivial to ext= end - * this, when necessary. Use this instead of strncpy inside libbpf source = code. +/* + * Simplified strscpy() implementation. The kernel one is in lib/string.c */ -static inline void bpf_strlcpy(char *dst, const char *src, size_t sz) +static inline ssize_t sized_strscpy(char *dest, const char *src, size_t co= unt) { - size_t i; + long res =3D 0; =20 - if (sz =3D=3D 0) - return; + if (count =3D=3D 0) + return -E2BIG; =20 - sz--; - for (i =3D 0; i < sz && src[i]; i++) - dst[i] =3D src[i]; - dst[i] =3D '\0'; + while (count > 1) { + char c; + + c =3D src[res]; + dest[res] =3D c; + if (!c) + return res; + res++; + count--; + } + + /* Force NUL-termination. */ + dest[res] =3D '\0'; + + /* Return E2BIG if the source didn't stop */ + return src[res] ? -E2BIG : res; } =20 +#undef strscpy /* Redefine the placeholder from tools/include/linux/string= .h */ +#define strscpy sized_strscpy + #define __bpf_percpu_val_align __attribute__((__aligned__(8))) =20 #define BPF_DECLARE_PERCPU(type, name) \ diff --git a/tools/testing/selftests/bpf/cgroup_helpers.c b/tools/testing/s= elftests/bpf/cgroup_helpers.c index 20cede4db3ce..9661cceb62be 100644 --- a/tools/testing/selftests/bpf/cgroup_helpers.c +++ b/tools/testing/selftests/bpf/cgroup_helpers.c @@ -86,7 +86,7 @@ static int __enable_controllers(const char *cgroup_path, = const char *controllers enable[len] =3D 0; close(fd); } else { - bpf_strlcpy(enable, controllers, sizeof(enable)); + strscpy(enable, controllers, sizeof(enable)); } =20 snprintf(path, sizeof(path), "%s/cgroup.subtree_control", cgroup_path); --=20 2.53.0 From nobody Fri Apr 3 11:10:12 2026 Received: from out-177.mta0.migadu.com (out-177.mta0.migadu.com [91.218.175.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD55736655A for ; Fri, 20 Feb 2026 18:20:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611633; cv=none; b=qoCAkw7uIKJWloaPwiJpTiHWw4gwu0R4bT3KD+WLm3sRIma9cQv1l6MfeQVKRoJgst0d2+VgvU3Rg2sxK+wLYNZEDp/mSpP4icB3X7vDuZVAlxki5ogDiWshZAW2C/aL7vE/DT3Y3vwEB4cJMvbD5sw9Wa/JJ0yH7lT21IjfY/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611633; c=relaxed/simple; bh=h63tPitGQTOEsgp7IyxevOgPfZ7aaGbP/6iva5qm2dk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IIMHHbKeLOrLlT0gWg2cVxaqxZ5ZZNTFz8bUccn+8WNLuCuk/y8aI2b7J0ei5aaysY2VAaEQmHDG3Jw3dAhldGGQuwW4O61clPcxYcjPIPLDLVr9JDs/i8FkKEmyQxdsPcbdLC2Uh44B/5LgGkYbhWGe3wuzJZ7nOOqnsC3KdGA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=M3TEKyAl; arc=none smtp.client-ip=91.218.175.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="M3TEKyAl" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1771611629; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kCihQ6qjS+RPI+DS8xNyMGMASH1EpWMeASa7I1Y5ymw=; b=M3TEKyAlq2KYqv7OxiLyaq5/kwV9YSYrV2bJttbmrwX0C1fPvOzg1fPF2Otw6h22SNsjgS qOqMEuKb8zHWQTSKAZK/OLSg2xnXln1G6fUeOrxdLPnnIQ90ARg3JDb0a70s1OudnNO6hr 5VH0+AprWFhW6ZyybhapRVff26FDInE= From: Ihor Solodrai To: Alexei Starovoitov , Andrii Nakryiko , Daniel Borkmann , Eduard Zingerman Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH bpf v1 2/7] selftests/bpf: Add strscpy_cat() Date: Fri, 20 Feb 2026 10:20:06 -0800 Message-ID: <20260220182011.802116-3-ihor.solodrai@linux.dev> In-Reply-To: <20260220182011.802116-1-ihor.solodrai@linux.dev> References: <20260220182011.802116-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Add sized_strscpy_cat() to bpf_util.h, which concatenates multiple strings into a destination buffer with strscpy(). Add strscpy_cat() macro with varargs. This is a convenient helper that provides the same guarantees as strscpy(), but for a case when multiple strings need to be concatenated into destination. Signed-off-by: Ihor Solodrai Suggested-by: Alexei Starovoitov --- tools/testing/selftests/bpf/bpf_util.h | 28 ++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tools/testing/selftests/bpf/bpf_util.h b/tools/testing/selftes= ts/bpf/bpf_util.h index 8c95ef7ed7c0..61bb22c3e517 100644 --- a/tools/testing/selftests/bpf/bpf_util.h +++ b/tools/testing/selftests/bpf/bpf_util.h @@ -52,6 +52,34 @@ static inline ssize_t sized_strscpy(char *dest, const ch= ar *src, size_t count) #undef strscpy /* Redefine the placeholder from tools/include/linux/string= .h */ #define strscpy sized_strscpy =20 +/* + * strscpy() analogue that concatenates multiple strings into a buffer + */ +static inline ssize_t sized_strscpy_cat(char *dest, size_t dest_sz, + const char * const *srcs, size_t n) +{ + ssize_t pos =3D 0; + + if (dest_sz =3D=3D 0) + return -E2BIG; + + for (size_t i =3D 0; i < n; i++) { + ssize_t res =3D strscpy(dest + pos, srcs[i], dest_sz - pos); + + if (res < 0) + return res; + pos +=3D res; + } + + return pos; +} + +#define strscpy_cat(dest, count, ...) \ + sized_strscpy_cat(dest, count, \ + (const char * const[]){ __VA_ARGS__ }, \ + ARRAY_SIZE(((const char * const[]){ __VA_ARGS__ }))) + + #define __bpf_percpu_val_align __attribute__((__aligned__(8))) =20 #define BPF_DECLARE_PERCPU(type, name) \ --=20 2.53.0 From nobody Fri Apr 3 11:10:12 2026 Received: from out-183.mta0.migadu.com (out-183.mta0.migadu.com [91.218.175.183]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 244183002C8 for ; Fri, 20 Feb 2026 18:20:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.183 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611638; cv=none; b=LTxCERitQx4Mi4KnfDRw6qVu/kHOjfQ4B6u1kERsyXv4Sb9hlTimx2izvtTL1VTh13Hlusajfb2xGyJCojTLKkGnkr49DzoVoE8Q7hiSMxBAxOytmga8fc2BAE/g6p6680rt4zIPDXTULpXcf4/m/v0ztfEeUvS9f5Kfr+/S9jE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611638; c=relaxed/simple; bh=nsMuuFk/kq3cSDJMWIKeSA4aJRzWQVkozhQZWoCMUuI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=n/5hJDk8Oo6N5XtcYNXBDxYtzecK3/WDFbKIg9g0rbUCHhUPlXPYf//YvIMprqcw99OZMBqwB+Dnzy7zSNZRvvAQczmeBifZQ7vbP0+iBhgom6pT3Fnj6eqVvMpU71yBYzyCxnA+r4JDkgYuYminXCIL2oKua4yg13Po7Hd3xLk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=iaagtzjX; arc=none smtp.client-ip=91.218.175.183 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="iaagtzjX" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1771611632; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Sgmlbh6H6BmQox9aHPu1AdVnW79tgbRW8VeLWn91Isw=; b=iaagtzjXXE5i/ZBg1yJdlsbKVhr/xgKBp2vXg3gewSTs5WxqmqN4U32Vr/6tbmH7Z+ngS6 +ZtOBOW1ng5itBZtpSt4j1hiPqWNc/xX6Znk4CJcorZql0viV+se+b59s8l5oYs4mwP5bg CFqoC9lgcACrpSY7ejftRbAwQ2VytYc= From: Ihor Solodrai To: Alexei Starovoitov , Andrii Nakryiko , Daniel Borkmann , Eduard Zingerman Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH bpf v1 3/7] selftests/bpf: Replace strcpy() calls with strscpy() Date: Fri, 20 Feb 2026 10:20:07 -0800 Message-ID: <20260220182011.802116-4-ihor.solodrai@linux.dev> In-Reply-To: <20260220182011.802116-1-ihor.solodrai@linux.dev> References: <20260220182011.802116-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" strcpy() does not perform bounds checking and is considered deprecated [1]. Replace strcpy() calls with strscpy(), passing size of the destination buffer. [1] https://docs.kernel.org/process/deprecated.html#strcpy Signed-off-by: Ihor Solodrai Suggested-by: Alexei Starovoitov --- tools/testing/selftests/bpf/network_helpers.c | 2 +- tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c | 2 +- tools/testing/selftests/bpf/prog_tests/setget_sockopt.c | 2 +- tools/testing/selftests/bpf/prog_tests/sockopt_sk.c | 2 +- tools/testing/selftests/bpf/prog_tests/test_veristat.c | 4 ++-- tools/testing/selftests/bpf/xdp_features.c | 3 ++- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/bpf/network_helpers.c b/tools/testing/= selftests/bpf/network_helpers.c index 0a6a5561bed3..5374b7e16d53 100644 --- a/tools/testing/selftests/bpf/network_helpers.c +++ b/tools/testing/selftests/bpf/network_helpers.c @@ -432,7 +432,7 @@ int make_sockaddr(int family, const char *addr_str, __u= 16 port, memset(addr, 0, sizeof(*sun)); sun->sun_family =3D family; sun->sun_path[0] =3D 0; - strcpy(sun->sun_path + 1, addr_str); + strscpy(sun->sun_path + 1, addr_str, sizeof(sun->sun_path) - 1); if (len) *len =3D offsetof(struct sockaddr_un, sun_path) + 1 + strlen(addr_str); return 0; diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c b/tools/te= sting/selftests/bpf/prog_tests/bpf_tcp_ca.c index b7d1b52309d0..2afedd08c037 100644 --- a/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c +++ b/tools/testing/selftests/bpf/prog_tests/bpf_tcp_ca.c @@ -281,7 +281,7 @@ static void test_dctcp_fallback(void) dctcp_skel =3D bpf_dctcp__open(); if (!ASSERT_OK_PTR(dctcp_skel, "dctcp_skel")) return; - strcpy(dctcp_skel->rodata->fallback_cc, "cubic"); + strscpy(dctcp_skel->rodata->fallback_cc, "cubic", sizeof(dctcp_skel->roda= ta->fallback_cc)); if (!ASSERT_OK(bpf_dctcp__load(dctcp_skel), "bpf_dctcp__load")) goto done; =20 diff --git a/tools/testing/selftests/bpf/prog_tests/setget_sockopt.c b/tool= s/testing/selftests/bpf/prog_tests/setget_sockopt.c index e4dac529d424..7905fbe11447 100644 --- a/tools/testing/selftests/bpf/prog_tests/setget_sockopt.c +++ b/tools/testing/selftests/bpf/prog_tests/setget_sockopt.c @@ -212,7 +212,7 @@ void test_setget_sockopt(void) if (!ASSERT_OK_PTR(skel, "open skel")) goto done; =20 - strcpy(skel->rodata->veth, "binddevtest1"); + strscpy(skel->rodata->veth, "binddevtest1", sizeof(skel->rodata->veth)); skel->rodata->veth_ifindex =3D if_nametoindex("binddevtest1"); if (!ASSERT_GT(skel->rodata->veth_ifindex, 0, "if_nametoindex")) goto done; diff --git a/tools/testing/selftests/bpf/prog_tests/sockopt_sk.c b/tools/te= sting/selftests/bpf/prog_tests/sockopt_sk.c index ba6b3ec1156a..fb0414292af6 100644 --- a/tools/testing/selftests/bpf/prog_tests/sockopt_sk.c +++ b/tools/testing/selftests/bpf/prog_tests/sockopt_sk.c @@ -142,7 +142,7 @@ static int getsetsockopt(void) =20 /* TCP_CONGESTION can extend the string */ =20 - strcpy(buf.cc, "nv"); + strscpy(buf.cc, "nv", sizeof(buf.cc)); err =3D setsockopt(fd, SOL_TCP, TCP_CONGESTION, &buf, strlen("nv")); if (err) { log_err("Failed to call setsockopt(TCP_CONGESTION)"); diff --git a/tools/testing/selftests/bpf/prog_tests/test_veristat.c b/tools= /testing/selftests/bpf/prog_tests/test_veristat.c index b38c16b4247f..de3aab986060 100644 --- a/tools/testing/selftests/bpf/prog_tests/test_veristat.c +++ b/tools/testing/selftests/bpf/prog_tests/test_veristat.c @@ -24,9 +24,9 @@ static struct fixture *init_fixture(void) =20 /* for no_alu32 and cpuv4 veristat is in parent folder */ if (access("./veristat", F_OK) =3D=3D 0) - strcpy(fix->veristat, "./veristat"); + strscpy(fix->veristat, "./veristat", sizeof(fix->veristat)); else if (access("../veristat", F_OK) =3D=3D 0) - strcpy(fix->veristat, "../veristat"); + strscpy(fix->veristat, "../veristat", sizeof(fix->veristat)); else PRINT_FAIL("Can't find veristat binary"); =20 diff --git a/tools/testing/selftests/bpf/xdp_features.c b/tools/testing/sel= ftests/bpf/xdp_features.c index 595c79141cf3..5649d2dda9cc 100644 --- a/tools/testing/selftests/bpf/xdp_features.c +++ b/tools/testing/selftests/bpf/xdp_features.c @@ -16,6 +16,7 @@ =20 #include =20 +#include "bpf_util.h" #include "xdp_features.skel.h" #include "xdp_features.h" =20 @@ -212,7 +213,7 @@ static void set_env_default(void) env.feature.drv_feature =3D NETDEV_XDP_ACT_NDO_XMIT; env.feature.action =3D -EINVAL; env.ifindex =3D -ENODEV; - strcpy(env.ifname, "unknown"); + strscpy(env.ifname, "unknown", sizeof(env.ifname)); make_sockaddr(AF_INET6, "::ffff:127.0.0.1", DUT_CTRL_PORT, &env.dut_ctrl_addr, NULL); make_sockaddr(AF_INET6, "::ffff:127.0.0.1", DUT_ECHO_PORT, --=20 2.53.0 From nobody Fri Apr 3 11:10:12 2026 Received: from out-184.mta0.migadu.com (out-184.mta0.migadu.com [91.218.175.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3CCB036654E for ; Fri, 20 Feb 2026 18:20:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.184 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611637; cv=none; b=N6uIdoQ78hDGl7BjXv1WvFep9BCtr63OYL2fL4aDX5KkqcBdfgBupTJ4Gz9D7XHTTf2TR7oDNWPmPtMDkHN4EDwuV9VG57TQAX67hmnQMT8+hU49/8QAREbu6A9t/gZcwxmg+o1+IEQmuTqDPSIxZ2MkybPqzexozjyr3FpfNbU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611637; c=relaxed/simple; bh=rOkYQyeTp9C2B/H3fq0Y5U90qTgsVE1nysYk2iavar4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oSs7dthqQuPmfPzO+XyafHMTl0/YKIVXFanE/EKw+u3upWLOP4u0yUQ5C9bpeXYAEMR92JpgR2j068yRIxm7jYHLkH1BdbyRnBxCtA9PGubqjGyd8TI8JvxtkP7D2Qy8i/CyeIkVCEEa8AGh1jtJQW1o3IC0XENW8i6qD8yMKXA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=WE5EzMzj; arc=none smtp.client-ip=91.218.175.184 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="WE5EzMzj" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1771611634; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WekUd+xrCB+1XCjrrsvI/+QNkM6JaxitZ3Psn1wFge0=; b=WE5EzMzjh/lL/ObpjLG7JHTEkjw516wHVXpp3zSvJ1yxvrpbHSa/EGUwp28Q97AkDWoyoD K9hqka2lMrugrAW5JqkPdt9ViZzGaxwW9YfPVsnSPQacE9itZuGSstr0Z53B9GGlwKjy6x 9n0FRE7BgsWKCWh9u/PekcrRsD5xHB8= From: Ihor Solodrai To: Alexei Starovoitov , Andrii Nakryiko , Daniel Borkmann , Eduard Zingerman Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH bpf v1 4/7] selftests/bpf: Replace strncpy() with strscpy() Date: Fri, 20 Feb 2026 10:20:08 -0800 Message-ID: <20260220182011.802116-5-ihor.solodrai@linux.dev> In-Reply-To: <20260220182011.802116-1-ihor.solodrai@linux.dev> References: <20260220182011.802116-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" strncpy() does not guarantee NUL-termination and is considered deprecated [1]. Replace strncpy() calls with strscpy(). [1] https://docs.kernel.org/process/deprecated.html#strncpy-on-nul-terminat= ed-strings Signed-off-by: Ihor Solodrai Suggested-by: Alexei Starovoitov --- tools/testing/selftests/bpf/network_helpers.c | 3 +-- tools/testing/selftests/bpf/prog_tests/align.c | 2 +- tools/testing/selftests/bpf/prog_tests/bpf_iter.c | 3 +-- tools/testing/selftests/bpf/prog_tests/flow_dissector.c | 4 ++-- tools/testing/selftests/bpf/prog_tests/queue_stack_map.c | 4 ++-- tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c | 2 +- tools/testing/selftests/bpf/prog_tests/task_local_data.h | 2 +- tools/testing/selftests/bpf/prog_tests/tc_redirect.c | 2 +- tools/testing/selftests/bpf/test_progs.c | 2 +- tools/testing/selftests/bpf/xdp_hw_metadata.c | 4 ++-- 10 files changed, 13 insertions(+), 15 deletions(-) diff --git a/tools/testing/selftests/bpf/network_helpers.c b/tools/testing/= selftests/bpf/network_helpers.c index 5374b7e16d53..e169c6ece524 100644 --- a/tools/testing/selftests/bpf/network_helpers.c +++ b/tools/testing/selftests/bpf/network_helpers.c @@ -581,8 +581,7 @@ int open_tuntap(const char *dev_name, bool need_mac) return -1; =20 ifr.ifr_flags =3D IFF_NO_PI | (need_mac ? IFF_TAP : IFF_TUN); - strncpy(ifr.ifr_name, dev_name, IFNAMSIZ - 1); - ifr.ifr_name[IFNAMSIZ - 1] =3D '\0'; + strscpy(ifr.ifr_name, dev_name, sizeof(ifr.ifr_name)); =20 err =3D ioctl(fd, TUNSETIFF, &ifr); if (!ASSERT_OK(err, "ioctl(TUNSETIFF)")) { diff --git a/tools/testing/selftests/bpf/prog_tests/align.c b/tools/testing= /selftests/bpf/prog_tests/align.c index 24c509ce4e5b..7b6e530a586c 100644 --- a/tools/testing/selftests/bpf/prog_tests/align.c +++ b/tools/testing/selftests/bpf/prog_tests/align.c @@ -633,7 +633,7 @@ static int do_test_single(struct bpf_align_test *test) } else { ret =3D 0; /* We make a local copy so that we can strtok() it */ - strncpy(bpf_vlog_copy, bpf_vlog, sizeof(bpf_vlog_copy)); + strscpy(bpf_vlog_copy, bpf_vlog, sizeof(bpf_vlog_copy)); start =3D strstr(bpf_vlog_copy, main_pass_start); if (!start) { ret =3D 1; diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c b/tools/test= ing/selftests/bpf/prog_tests/bpf_iter.c index 5225d69bf79b..c69080ca14f5 100644 --- a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c +++ b/tools/testing/selftests/bpf/prog_tests/bpf_iter.c @@ -346,8 +346,7 @@ static void test_task_sleepable(void) close(finish_pipe[1]); =20 test_data =3D malloc(sizeof(char) * 10); - strncpy(test_data, "test_data", 10); - test_data[9] =3D '\0'; + strscpy(test_data, "test_data", 10); =20 test_data_long =3D malloc(sizeof(char) * 5000); for (int i =3D 0; i < 5000; ++i) { diff --git a/tools/testing/selftests/bpf/prog_tests/flow_dissector.c b/tool= s/testing/selftests/bpf/prog_tests/flow_dissector.c index 08bae13248c4..22dbd13cf592 100644 --- a/tools/testing/selftests/bpf/prog_tests/flow_dissector.c +++ b/tools/testing/selftests/bpf/prog_tests/flow_dissector.c @@ -570,7 +570,7 @@ static int create_tap(const char *ifname) }; int fd, ret; =20 - strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); =20 fd =3D open("/dev/net/tun", O_RDWR); if (fd < 0) @@ -599,7 +599,7 @@ static int ifup(const char *ifname) struct ifreq ifr =3D {}; int sk, ret; =20 - strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); =20 sk =3D socket(PF_INET, SOCK_DGRAM, 0); if (sk < 0) diff --git a/tools/testing/selftests/bpf/prog_tests/queue_stack_map.c b/too= ls/testing/selftests/bpf/prog_tests/queue_stack_map.c index a043af9cd6d9..a3c6acc33d5d 100644 --- a/tools/testing/selftests/bpf/prog_tests/queue_stack_map.c +++ b/tools/testing/selftests/bpf/prog_tests/queue_stack_map.c @@ -28,9 +28,9 @@ static void test_queue_stack_map_by_type(int type) vals[i] =3D rand(); =20 if (type =3D=3D QUEUE) - strncpy(file, "./test_queue_map.bpf.o", sizeof(file)); + strscpy(file, "./test_queue_map.bpf.o", sizeof(file)); else if (type =3D=3D STACK) - strncpy(file, "./test_stack_map.bpf.o", sizeof(file)); + strscpy(file, "./test_stack_map.bpf.o", sizeof(file)); else return; =20 diff --git a/tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c b/to= ols/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c index 3eefdfed1db9..74f6d7404d1b 100644 --- a/tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c +++ b/tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c @@ -34,7 +34,7 @@ void test_skc_to_unix_sock(void) =20 memset(&sockaddr, 0, sizeof(sockaddr)); sockaddr.sun_family =3D AF_UNIX; - strncpy(sockaddr.sun_path, sock_path, strlen(sock_path)); + strscpy(sockaddr.sun_path, sock_path, sizeof(sockaddr.sun_path)); sockaddr.sun_path[0] =3D '\0'; =20 err =3D bind(sockfd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)); diff --git a/tools/testing/selftests/bpf/prog_tests/task_local_data.h b/too= ls/testing/selftests/bpf/prog_tests/task_local_data.h index 0f86b9275cf9..26e6218a2dd6 100644 --- a/tools/testing/selftests/bpf/prog_tests/task_local_data.h +++ b/tools/testing/selftests/bpf/prog_tests/task_local_data.h @@ -262,7 +262,7 @@ static tld_key_t __tld_create_key(const char *name, siz= e_t size, bool dyn_data) if (!atomic_compare_exchange_strong(&tld_meta_p->cnt, &cnt, cnt + 1)) goto retry; =20 - strncpy(tld_meta_p->metadata[i].name, name, TLD_NAME_LEN); + strscpy(tld_meta_p->metadata[i].name, name, TLD_NAME_LEN); atomic_store(&tld_meta_p->metadata[i].size, size); return (tld_key_t){(__s16)off}; } diff --git a/tools/testing/selftests/bpf/prog_tests/tc_redirect.c b/tools/t= esting/selftests/bpf/prog_tests/tc_redirect.c index 76d72a59365e..bd0010e5364f 100644 --- a/tools/testing/selftests/bpf/prog_tests/tc_redirect.c +++ b/tools/testing/selftests/bpf/prog_tests/tc_redirect.c @@ -1095,7 +1095,7 @@ static int tun_open(char *name) =20 ifr.ifr_flags =3D IFF_TUN | IFF_NO_PI; if (*name) - strncpy(ifr.ifr_name, name, IFNAMSIZ); + strscpy(ifr.ifr_name, name, IFNAMSIZ); =20 err =3D ioctl(fd, TUNSETIFF, &ifr); if (!ASSERT_OK(err, "ioctl TUNSETIFF")) diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selft= ests/bpf/test_progs.c index 02a85dda30e6..d1418ec1f351 100644 --- a/tools/testing/selftests/bpf/test_progs.c +++ b/tools/testing/selftests/bpf/test_progs.c @@ -1799,7 +1799,7 @@ static int worker_main_send_subtests(int sock, struct= test_state *state) =20 msg.subtest_done.num =3D i; =20 - strncpy(msg.subtest_done.name, subtest_state->name, MAX_SUBTEST_NAME); + strscpy(msg.subtest_done.name, subtest_state->name, MAX_SUBTEST_NAME); =20 msg.subtest_done.error_cnt =3D subtest_state->error_cnt; msg.subtest_done.skipped =3D subtest_state->skipped; diff --git a/tools/testing/selftests/bpf/xdp_hw_metadata.c b/tools/testing/= selftests/bpf/xdp_hw_metadata.c index 3d8de0d4c96a..1de1bcdb2c9a 100644 --- a/tools/testing/selftests/bpf/xdp_hw_metadata.c +++ b/tools/testing/selftests/bpf/xdp_hw_metadata.c @@ -550,7 +550,7 @@ static int rxq_num(const char *ifname) struct ifreq ifr =3D { .ifr_data =3D (void *)&ch, }; - strncpy(ifr.ifr_name, ifname, IF_NAMESIZE - 1); + strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); int fd, ret; =20 fd =3D socket(AF_UNIX, SOCK_DGRAM, 0); @@ -571,7 +571,7 @@ static void hwtstamp_ioctl(int op, const char *ifname, = struct hwtstamp_config *c struct ifreq ifr =3D { .ifr_data =3D (void *)cfg, }; - strncpy(ifr.ifr_name, ifname, IF_NAMESIZE - 1); + strscpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); int fd, ret; =20 fd =3D socket(AF_UNIX, SOCK_DGRAM, 0); --=20 2.53.0 From nobody Fri Apr 3 11:10:12 2026 Received: from out-182.mta0.migadu.com (out-182.mta0.migadu.com [91.218.175.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 71B92366544 for ; Fri, 20 Feb 2026 18:20:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611639; cv=none; b=HtA9PSkc7lsv7HVh0QEaOLNJUWkAddIF2xneUJAaAaZ9vbalT2y/L+qjaJ0gQoW9y8IyA2b549DrTfUVkslWdxXOx/HgmeAKXo/scDTNzhOdR2adiA+QJm2+eR7CVSDLptMZjVfoVwZew14EPbbzBOW1ZQSpGudG3F0hDaoTUes= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611639; c=relaxed/simple; bh=B70Dg1KnWId+84nKzdvSCzbx9v8OOTz5PhxPUSIWwmg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o1Mk4G+sWQXL7CNSNdlzgwIsJHZpHxOR4V6+kao5I1mKuZLb29GhPrhKV97XafEwx50tT+KAdMbPDbOkrjdCqS05iemSjcWLtf9UZd8TK6LDl32p/GwQD+5yXntck9gMtT0OyDT9jnoAk+ibUfnOll8f8ppPBh/azZQsi3L2wDc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=G8VI7y3h; arc=none smtp.client-ip=91.218.175.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="G8VI7y3h" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1771611636; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RaXcc3pAAHmc8PSgdViMdDRL6D0Fzy3EW/WYrcZC0ac=; b=G8VI7y3hAwkBLiZZYr4HkjydRWseGSN9qmA3N/uBhIeWhpK0y6C0dpebiZCZMIKu7Z0Tm/ aTcVSMVIXMYNaKN2JJ/6N+dnCCbqOmbWLJwbX3xwwWQyF4LIGtGzKZQZ5cvTmmw6xFDdLC 1XX/YcSiuLmlSSDr64oWzEyzThC4X+Q= From: Ihor Solodrai To: Alexei Starovoitov , Andrii Nakryiko , Daniel Borkmann , Eduard Zingerman Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH bpf v1 5/7] selftests/bpf: Use strscpy_cat() in the test_loader Date: Fri, 20 Feb 2026 10:20:09 -0800 Message-ID: <20260220182011.802116-6-ihor.solodrai@linux.dev> In-Reply-To: <20260220182011.802116-1-ihor.solodrai@linux.dev> References: <20260220182011.802116-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Replace a pair of strcpy() calls that construct the unpriv test name with a single strscpy_cat() call. This simplifies the code and adds bounds checking. Signed-off-by: Ihor Solodrai Suggested-by: Alexei Starovoitov --- tools/testing/selftests/bpf/test_loader.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/bpf/test_loader.c b/tools/testing/self= tests/bpf/test_loader.c index 338c035c3688..af4319566fea 100644 --- a/tools/testing/selftests/bpf/test_loader.c +++ b/tools/testing/selftests/bpf/test_loader.c @@ -673,18 +673,18 @@ static int parse_test_spec(struct test_loader *tester, =20 if (spec->mode_mask & UNPRIV) { int descr_len =3D strlen(description); - const char *suffix =3D " @unpriv"; + static const char suffix[] =3D " @unpriv"; + int name_len =3D descr_len + sizeof(suffix) + 1; char *name; =20 - name =3D malloc(descr_len + strlen(suffix) + 1); + name =3D malloc(name_len); if (!name) { PRINT_FAIL("failed to allocate memory for unpriv.name\n"); err =3D -ENOMEM; goto cleanup; } =20 - strcpy(name, description); - strcpy(&name[descr_len], suffix); + strscpy_cat(name, name_len, description, suffix); spec->unpriv.name =3D name; } =20 --=20 2.53.0 From nobody Fri Apr 3 11:10:12 2026 Received: from out-170.mta0.migadu.com (out-170.mta0.migadu.com [91.218.175.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 132D2366578 for ; Fri, 20 Feb 2026 18:20:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611645; cv=none; b=GA18P2SjFdoI0WySTaKguH7TUuiuZfm2uHB8KFEO2OXbLcJoS2JOcrxx27L/H8mjF4LgcJU08Bct0PAUytQ3Mz1Ttobb4IU0e5hms/3bqiDjFgSwd4DlY5FylxfsB/JpeKE1+uYkD2OS5JoIit7NHjXSFuRUUSO/E7tVyvbt8Hk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611645; c=relaxed/simple; bh=0movS6g8APFRjZGKZxVGfx4aQ9pQCEmIriIwrf/tT1Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uJv0+pSAXPG4tdzI9C4mssSWJgvMooSHbJ+pIeTIU9w4tYsjG7gwhTybSPZVlc22i5kkQY+HHH0kLRi8ZNTztT3LijDmdYONJ1a9QZh4Cerp58vr5AK/FJ9JGSA8M3KdcOG9F54oE+rSZgQZ8YV6syB6a82Go50D6Q4gZ+b19oE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=OIPISkkZ; arc=none smtp.client-ip=91.218.175.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="OIPISkkZ" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1771611639; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xCpZCnCQl1G+f+btfDm78pmpn5ENUAINv/Yhi6LMNhQ=; b=OIPISkkZdjhjaEEOBCxu3AyLwlH0mo/IA/m44DTQN2sdvp0fjZIznUcDsvJ5q5FeVQR3Dk lRsT58XHdkv4/TzeEm7Nq+51gA0Lj2zQjhOmJPOEGpDNWmulJZBz4crdEnZRGzKJJOnxxy pllVSu6U3ogk6+/efm/neJAr9Akx6H8= From: Ihor Solodrai To: Alexei Starovoitov , Andrii Nakryiko , Daniel Borkmann , Eduard Zingerman Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH bpf v1 6/7] selftests/bpf: Use strscpy in bpftool_helpers.c Date: Fri, 20 Feb 2026 10:20:10 -0800 Message-ID: <20260220182011.802116-7-ihor.solodrai@linux.dev> In-Reply-To: <20260220182011.802116-1-ihor.solodrai@linux.dev> References: <20260220182011.802116-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Replace strncpy() and snprintf() calls in bpftool_helpers.c with strscpy() and strscpy_cat() respectively. Pass the destination buffer size to detect_bpftool_path() instead of hardcoding BPFTOOL_PATH_MAX_LEN. Signed-off-by: Ihor Solodrai Suggested-by: Alexei Starovoitov --- tools/testing/selftests/bpf/bpftool_helpers.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/bpf/bpftool_helpers.c b/tools/testing/= selftests/bpf/bpftool_helpers.c index a5824945a4a5..c99776b03f52 100644 --- a/tools/testing/selftests/bpf/bpftool_helpers.c +++ b/tools/testing/selftests/bpf/bpftool_helpers.c @@ -1,33 +1,35 @@ // SPDX-License-Identifier: GPL-2.0-only -#include "bpftool_helpers.h" #include #include #include =20 +#include "bpf_util.h" +#include "bpftool_helpers.h" + #define BPFTOOL_PATH_MAX_LEN 64 #define BPFTOOL_FULL_CMD_MAX_LEN 512 =20 #define BPFTOOL_DEFAULT_PATH "tools/sbin/bpftool" =20 -static int detect_bpftool_path(char *buffer) +static int detect_bpftool_path(char *buffer, size_t size) { char tmp[BPFTOOL_PATH_MAX_LEN]; =20 /* Check default bpftool location (will work if we are running the * default flavor of test_progs) */ - snprintf(tmp, BPFTOOL_PATH_MAX_LEN, "./%s", BPFTOOL_DEFAULT_PATH); + strscpy_cat(tmp, sizeof(tmp), "./", BPFTOOL_DEFAULT_PATH); if (access(tmp, X_OK) =3D=3D 0) { - strncpy(buffer, tmp, BPFTOOL_PATH_MAX_LEN); + strscpy(buffer, tmp, size); return 0; } =20 /* Check alternate bpftool location (will work if we are running a * specific flavor of test_progs, e.g. cpuv4 or no_alu32) */ - snprintf(tmp, BPFTOOL_PATH_MAX_LEN, "../%s", BPFTOOL_DEFAULT_PATH); + strscpy_cat(tmp, sizeof(tmp), "../", BPFTOOL_DEFAULT_PATH); if (access(tmp, X_OK) =3D=3D 0) { - strncpy(buffer, tmp, BPFTOOL_PATH_MAX_LEN); + strscpy(buffer, tmp, size); return 0; } =20 @@ -44,7 +46,7 @@ static int run_command(char *args, char *output_buf, size= _t output_max_len) int ret; =20 /* Detect and cache bpftool binary location */ - if (bpftool_path[0] =3D=3D 0 && detect_bpftool_path(bpftool_path)) + if (bpftool_path[0] =3D=3D 0 && detect_bpftool_path(bpftool_path, sizeof(= bpftool_path))) return 1; =20 ret =3D snprintf(command, BPFTOOL_FULL_CMD_MAX_LEN, "%s %s%s", --=20 2.53.0 From nobody Fri Apr 3 11:10:12 2026 Received: from out-182.mta0.migadu.com (out-182.mta0.migadu.com [91.218.175.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1FA0C366055 for ; Fri, 20 Feb 2026 18:20:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611647; cv=none; b=DkmkE8d/n8SkjPCs5Oo3RGOZMIpjSsPw/srNwMUrmHTq06W38BT8F9QfCYo0nmE1rQA6pEc0FtQQ3rIpPMLM10XRrESxehHE/QSfwOYUoYEydzvo2+lY2p4wzdxvLTyeqtf5ir2mYVx1VjQCGTsphUhilpRp51UdMqDyfQxHmi4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771611647; c=relaxed/simple; bh=f/Bx+ZsJ1fAcffz9ruvdWWPF/FpD+naaO17ejS4QjGk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TLblvKcC6/kh4a37gSghEDO3mF3jQOP1vz4Gx381ES9BqDHRxHEuxPUrx3GFqDJAPFuXbOWbMEuBDUwCnjfESkNgVWLFQT9+4Fc1Das0etmjOoIy8r8x9iSy5Vks5N7RTdX6MLiNxHdV0g71phdjgrj+gKTmcEwQgYUZ7PCmZgg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=CmbFZrOw; arc=none smtp.client-ip=91.218.175.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="CmbFZrOw" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1771611641; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BXpYJcNqc32baJ6rjSBeAUDkFNtFLG2PdKUrKRzmF18=; b=CmbFZrOwX2sunt5l/tbvTFF0PDGGP6VX/DP9Tp6beQb612x1lAQjNaFZ8Fz5mRbvoBUbPy GTSvFs9KVcKSwwmp25V+jFgH88MKU3ynLNKOjcZ5M6XKnOGjACgDKP7jXFyugHTyHIE8kn 6QCX9xCUynAxh4eOS2yRLMTQu1AmvWw= From: Ihor Solodrai To: Alexei Starovoitov , Andrii Nakryiko , Daniel Borkmann , Eduard Zingerman Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH bpf v1 7/7] selftests/bpf: Use memcpy() for bounded non-NULL-terminated copies Date: Fri, 20 Feb 2026 10:20:11 -0800 Message-ID: <20260220182011.802116-8-ihor.solodrai@linux.dev> In-Reply-To: <20260220182011.802116-1-ihor.solodrai@linux.dev> References: <20260220182011.802116-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Replace strncpy() with memcpy() in cases where the source is non-NULL-terminated and the copy length is known. Signed-off-by: Ihor Solodrai Suggested-by: Alexei Starovoitov --- tools/testing/selftests/bpf/prog_tests/ctx_rewrite.c | 6 ++++-- tools/testing/selftests/bpf/test_verifier.c | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/ctx_rewrite.c b/tools/t= esting/selftests/bpf/prog_tests/ctx_rewrite.c index dd75ccb03770..469e92869523 100644 --- a/tools/testing/selftests/bpf/prog_tests/ctx_rewrite.c +++ b/tools/testing/selftests/bpf/prog_tests/ctx_rewrite.c @@ -308,8 +308,10 @@ static int find_field_offset(struct btf *btf, char *pa= ttern, regmatch_t *matches return -1; } =20 - strncpy(type_str, type, type_sz); - strncpy(field_str, field, field_sz); + memcpy(type_str, type, type_sz); + type_str[type_sz] =3D '\0'; + memcpy(field_str, field, field_sz); + field_str[field_sz] =3D '\0'; btf_id =3D btf__find_by_name(btf, type_str); if (btf_id < 0) { PRINT_FAIL("No BTF info for type %s\n", type_str); diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/se= lftests/bpf/test_verifier.c index 27db34ecf3f5..a8ae03c57bba 100644 --- a/tools/testing/selftests/bpf/test_verifier.c +++ b/tools/testing/selftests/bpf/test_verifier.c @@ -1320,7 +1320,7 @@ static bool cmp_str_seq(const char *log, const char *= exp) printf("FAIL\nTestcase bug\n"); return false; } - strncpy(needle, exp, len); + memcpy(needle, exp, len); needle[len] =3D 0; q =3D strstr(log, needle); if (!q) { --=20 2.53.0