[PATCH bpf v4 03/20] selftests/bpf: Replace strncpy() with strscpy()

Ihor Solodrai posted 20 patches 1 month, 1 week ago
Only 18 patches received!
[PATCH bpf v4 03/20] selftests/bpf: Replace strncpy() with strscpy()
Posted by Ihor Solodrai 1 month, 1 week ago
strncpy() does not guarantee NULL-termination and is considered
deprecated [1]. Replace strncpy() calls with strscpy().

[1] https://docs.kernel.org/process/deprecated.html#strncpy-on-nul-terminated-strings

Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
---
 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..b82f572641b7 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;
 
 	ifr.ifr_flags = IFF_NO_PI | (need_mac ? IFF_TAP : IFF_TUN);
-	strncpy(ifr.ifr_name, dev_name, IFNAMSIZ - 1);
-	ifr.ifr_name[IFNAMSIZ - 1] = '\0';
+	strscpy(ifr.ifr_name, dev_name);
 
 	err = 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..841a166b8081 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 = 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);
 		start = strstr(bpf_vlog_copy, main_pass_start);
 		if (!start) {
 			ret = 1;
diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c b/tools/testing/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]);
 
 		test_data = malloc(sizeof(char) * 10);
-		strncpy(test_data, "test_data", 10);
-		test_data[9] = '\0';
+		strscpy(test_data, "test_data", 10);
 
 		test_data_long = malloc(sizeof(char) * 5000);
 		for (int i = 0; i < 5000; ++i) {
diff --git a/tools/testing/selftests/bpf/prog_tests/flow_dissector.c b/tools/testing/selftests/bpf/prog_tests/flow_dissector.c
index 08bae13248c4..fb4892681464 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;
 
-	strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+	strscpy(ifr.ifr_name, ifname);
 
 	fd = open("/dev/net/tun", O_RDWR);
 	if (fd < 0)
@@ -599,7 +599,7 @@ static int ifup(const char *ifname)
 	struct ifreq ifr = {};
 	int sk, ret;
 
-	strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+	strscpy(ifr.ifr_name, ifname);
 
 	sk = socket(PF_INET, SOCK_DGRAM, 0);
 	if (sk < 0)
diff --git a/tools/testing/selftests/bpf/prog_tests/queue_stack_map.c b/tools/testing/selftests/bpf/prog_tests/queue_stack_map.c
index a043af9cd6d9..41441325e179 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] = rand();
 
 	if (type == QUEUE)
-		strncpy(file, "./test_queue_map.bpf.o", sizeof(file));
+		strscpy(file, "./test_queue_map.bpf.o");
 	else if (type == STACK)
-		strncpy(file, "./test_stack_map.bpf.o", sizeof(file));
+		strscpy(file, "./test_stack_map.bpf.o");
 	else
 		return;
 
diff --git a/tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c b/tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c
index 3eefdfed1db9..657d897958b6 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)
 
 	memset(&sockaddr, 0, sizeof(sockaddr));
 	sockaddr.sun_family = AF_UNIX;
-	strncpy(sockaddr.sun_path, sock_path, strlen(sock_path));
+	strscpy(sockaddr.sun_path, sock_path);
 	sockaddr.sun_path[0] = '\0';
 
 	err = bind(sockfd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
diff --git a/tools/testing/selftests/bpf/prog_tests/task_local_data.h b/tools/testing/selftests/bpf/prog_tests/task_local_data.h
index 0f86b9275cf9..8342e2fe5260 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, size_t size, bool dyn_data)
 		if (!atomic_compare_exchange_strong(&tld_meta_p->cnt, &cnt, cnt + 1))
 			goto retry;
 
-		strncpy(tld_meta_p->metadata[i].name, name, TLD_NAME_LEN);
+		strscpy(tld_meta_p->metadata[i].name, name);
 		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/testing/selftests/bpf/prog_tests/tc_redirect.c
index 76d72a59365e..64fbda082309 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)
 
 	ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
 	if (*name)
-		strncpy(ifr.ifr_name, name, IFNAMSIZ);
+		strscpy(ifr.ifr_name, name);
 
 	err = ioctl(fd, TUNSETIFF, &ifr);
 	if (!ASSERT_OK(err, "ioctl TUNSETIFF"))
diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/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)
 
 		msg.subtest_done.num = i;
 
-		strncpy(msg.subtest_done.name, subtest_state->name, MAX_SUBTEST_NAME);
+		strscpy(msg.subtest_done.name, subtest_state->name, MAX_SUBTEST_NAME);
 
 		msg.subtest_done.error_cnt = subtest_state->error_cnt;
 		msg.subtest_done.skipped = 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..6db3b5555a22 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 = {
 		.ifr_data = (void *)&ch,
 	};
-	strncpy(ifr.ifr_name, ifname, IF_NAMESIZE - 1);
+	strscpy(ifr.ifr_name, ifname);
 	int fd, ret;
 
 	fd = 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 = {
 		.ifr_data = (void *)cfg,
 	};
-	strncpy(ifr.ifr_name, ifname, IF_NAMESIZE - 1);
+	strscpy(ifr.ifr_name, ifname);
 	int fd, ret;
 
 	fd = socket(AF_UNIX, SOCK_DGRAM, 0);
-- 
2.53.0
Re: [PATCH bpf v4 03/20] selftests/bpf: Replace strncpy() with strscpy()
Posted by Eduard Zingerman 1 month, 1 week ago
On Mon, 2026-02-23 at 11:07 -0800, Ihor Solodrai wrote:

[...]

> diff --git a/tools/testing/selftests/bpf/prog_tests/align.c b/tools/testing/selftests/bpf/prog_tests/align.c
> index 24c509ce4e5b..841a166b8081 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 = 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);
>  		start = strstr(bpf_vlog_copy, main_pass_start);
>  		if (!start) {
>  			ret = 1;

This hunk no longer applies.

[...]
Re: [PATCH bpf v4 03/20] selftests/bpf: Replace strncpy() with strscpy()
Posted by Ihor Solodrai 1 month, 1 week ago
On 2/23/26 2:28 PM, Eduard Zingerman wrote:
> On Mon, 2026-02-23 at 11:07 -0800, Ihor Solodrai wrote:
> 
> [...]
> 
>> diff --git a/tools/testing/selftests/bpf/prog_tests/align.c b/tools/testing/selftests/bpf/prog_tests/align.c
>> index 24c509ce4e5b..841a166b8081 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 = 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);
>>  		start = strstr(bpf_vlog_copy, main_pass_start);
>>  		if (!start) {
>>  			ret = 1;
> 
> This hunk no longer applies.


Hmm... Applies for me. What revision did you try?

$ git log -1 --oneline 
6de23f81a5e0 (HEAD, tag: v7.0-rc1, origin/bpf) Linux 7.0-rc1

$ b4 shazam 20260223190736.649171-1-ihor.solodrai@linux.dev
Grabbing thread from lore.kernel.org/all/20260223190736.649171-1-ihor.solodrai@linux.dev/t.mbox.gz
Checking for newer revisions
Grabbing search results from lore.kernel.org
Analyzing 22 messages in the thread
Looking for additional code-review trailers on lore.kernel.org
Analyzing 103 code-review messages
Checking attestation on all messages, may take a moment...
---
  ✓ [PATCH v4 1/20] selftests/bpf: Add simple strscpy() implementation
  ✓ [PATCH v4 2/20] selftests/bpf: Replace strcpy() calls with strscpy()
  ✓ [PATCH v4 3/20] selftests/bpf: Replace strncpy() with strscpy()
  ✓ [PATCH v4 4/20] selftests/bpf: Use strscpy in bpftool_helpers.c
  ✓ [PATCH v4 5/20] selftests/bpf: Use memcpy() for bounded non-NULL-terminated copies
  ✓ [PATCH v4 6/20] selftests/bpf: Pass through build flags to bpftool and resolve_btfids
  ✓ [PATCH v4 7/20] resolve_btfids: Fix memory leaks reported by ASAN
  ✓ [PATCH v4 8/20] selftests/bpf: Add DENYLIST.asan
  ✓ [PATCH v4 9/20] selftests/bpf: Refactor bpf_get_ksyms() trace helper
  ✓ [PATCH v4 10/20] selftests/bpf: Fix memory leaks in tests
  ✓ [PATCH v4 11/20] selftests/bpf: Fix cleanup in check_fd_array_cnt__fd_array_too_big()
  ✓ [PATCH v4 12/20] veristat: Fix a memory leak for preset ENUMERATOR
  ✓ [PATCH v4 13/20] selftests/bpf: Fix use-after-free in xdp_metadata test
  ✓ [PATCH v4 14/20] selftests/bpf: Fix double thread join in uprobe_multi_test
  ✓ [PATCH v4 15/20] selftests/bpf: Fix resource leaks caused by missing cleanups
  ✓ [PATCH v4 16/20] selftests/bpf: Free bpf_object in test_sysctl
  ✓ [PATCH v4 17/20] selftests/bpf: Fix array bounds warning in jit_disasm_helpers
  ✓ [PATCH v4 18/20] selftests/bpf: Fix out-of-bounds array access bugs reported by ASAN
  ✓ [PATCH v4 19/20] selftests/bpf: Check BPFTOOL env var in detect_bpftool_path()
  ✓ [PATCH v4 20/20] selftests/bpf: Don't override SIGSEGV handler with ASAN
  ---
  ✓ Signed: DKIM/linux.dev
---
Total patches: 20
---
Applying: selftests/bpf: Add simple strscpy() implementation
Applying: selftests/bpf: Replace strcpy() calls with strscpy()
Applying: selftests/bpf: Replace strncpy() with strscpy()
Applying: selftests/bpf: Use strscpy in bpftool_helpers.c
Applying: selftests/bpf: Use memcpy() for bounded non-NULL-terminated copies
Applying: selftests/bpf: Pass through build flags to bpftool and resolve_btfids
Applying: resolve_btfids: Fix memory leaks reported by ASAN
Applying: selftests/bpf: Add DENYLIST.asan
Applying: selftests/bpf: Refactor bpf_get_ksyms() trace helper
Applying: selftests/bpf: Fix memory leaks in tests
Applying: selftests/bpf: Fix cleanup in check_fd_array_cnt__fd_array_too_big()
Applying: veristat: Fix a memory leak for preset ENUMERATOR
Applying: selftests/bpf: Fix use-after-free in xdp_metadata test
Applying: selftests/bpf: Fix double thread join in uprobe_multi_test
Applying: selftests/bpf: Fix resource leaks caused by missing cleanups
Applying: selftests/bpf: Free bpf_object in test_sysctl
Applying: selftests/bpf: Fix array bounds warning in jit_disasm_helpers
Applying: selftests/bpf: Fix out-of-bounds array access bugs reported by ASAN
Applying: selftests/bpf: Check BPFTOOL env var in detect_bpftool_path()
Applying: selftests/bpf: Don't override SIGSEGV handler with ASAN


> 
> [...]

Re: [PATCH bpf v4 03/20] selftests/bpf: Replace strncpy() with strscpy()
Posted by Eduard Zingerman 1 month, 1 week ago
On Mon, 2026-02-23 at 14:32 -0800, Ihor Solodrai wrote:
> On 2/23/26 2:28 PM, Eduard Zingerman wrote:
> > On Mon, 2026-02-23 at 11:07 -0800, Ihor Solodrai wrote:
> > 
> > [...]
> > 
> > > diff --git a/tools/testing/selftests/bpf/prog_tests/align.c b/tools/testing/selftests/bpf/prog_tests/align.c
> > > index 24c509ce4e5b..841a166b8081 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 = 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);
> > >  		start = strstr(bpf_vlog_copy, main_pass_start);
> > >  		if (!start) {
> > >  			ret = 1;
> > 
> > This hunk no longer applies.
> 
> 
> Hmm... Applies for me. What revision did you try?
> 
> $ git log -1 --oneline 
> 6de23f81a5e0 (HEAD, tag: v7.0-rc1, origin/bpf) Linux 7.0-rc1
> 
> $ b4 shazam 20260223190736.649171-1-ihor.solodrai@linux.dev
> Grabbing thread from lore.kernel.org/all/20260223190736.649171-1-ihor.solodrai@linux.dev/t.mbox.gz
> Checking for newer revisions
> Grabbing search results from lore.kernel.org
> Analyzing 22 messages in the thread
> Looking for additional code-review trailers on lore.kernel.org
> Analyzing 103 code-review messages
> Checking attestation on all messages, may take a moment...
> ---

Uh-oh, it is for 'bpf' tree. I applied to 'bpf-next', sorry for the noise.

[...]