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
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.
[...]
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
>
> [...]
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.
[...]
© 2016 - 2026 Red Hat, Inc.