]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - tools/testing/selftests/bpf/test_sockmap.c
selftests/bpf: Fix invalid use of strncat in test_sockmap
[mirror_ubuntu-hirsute-kernel.git] / tools / testing / selftests / bpf / test_sockmap.c
index 0fa1e421c3d7a145b0c497616948a513e163a724..427ca00a32177a2b48b3c2e590e414aabf0bc69f 100644 (file)
@@ -1273,6 +1273,16 @@ static char *test_to_str(int test)
        return "unknown";
 }
 
+static void append_str(char *dst, const char *src, size_t dst_cap)
+{
+       size_t avail = dst_cap - strlen(dst);
+
+       if (avail <= 1) /* just zero byte could be written */
+               return;
+
+       strncat(dst, src, avail - 1); /* strncat() adds + 1 for zero byte */
+}
+
 #define OPTSTRING 60
 static void test_options(char *options)
 {
@@ -1281,42 +1291,42 @@ static void test_options(char *options)
        memset(options, 0, OPTSTRING);
 
        if (txmsg_pass)
-               strncat(options, "pass,", OPTSTRING);
+               append_str(options, "pass,", OPTSTRING);
        if (txmsg_redir)
-               strncat(options, "redir,", OPTSTRING);
+               append_str(options, "redir,", OPTSTRING);
        if (txmsg_drop)
-               strncat(options, "drop,", OPTSTRING);
+               append_str(options, "drop,", OPTSTRING);
        if (txmsg_apply) {
                snprintf(tstr, OPTSTRING, "apply %d,", txmsg_apply);
-               strncat(options, tstr, OPTSTRING);
+               append_str(options, tstr, OPTSTRING);
        }
        if (txmsg_cork) {
                snprintf(tstr, OPTSTRING, "cork %d,", txmsg_cork);
-               strncat(options, tstr, OPTSTRING);
+               append_str(options, tstr, OPTSTRING);
        }
        if (txmsg_start) {
                snprintf(tstr, OPTSTRING, "start %d,", txmsg_start);
-               strncat(options, tstr, OPTSTRING);
+               append_str(options, tstr, OPTSTRING);
        }
        if (txmsg_end) {
                snprintf(tstr, OPTSTRING, "end %d,", txmsg_end);
-               strncat(options, tstr, OPTSTRING);
+               append_str(options, tstr, OPTSTRING);
        }
        if (txmsg_start_pop) {
                snprintf(tstr, OPTSTRING, "pop (%d,%d),",
                         txmsg_start_pop, txmsg_start_pop + txmsg_pop);
-               strncat(options, tstr, OPTSTRING);
+               append_str(options, tstr, OPTSTRING);
        }
        if (txmsg_ingress)
-               strncat(options, "ingress,", OPTSTRING);
+               append_str(options, "ingress,", OPTSTRING);
        if (txmsg_redir_skb)
-               strncat(options, "redir_skb,", OPTSTRING);
+               append_str(options, "redir_skb,", OPTSTRING);
        if (txmsg_ktls_skb)
-               strncat(options, "ktls_skb,", OPTSTRING);
+               append_str(options, "ktls_skb,", OPTSTRING);
        if (ktls)
-               strncat(options, "ktls,", OPTSTRING);
+               append_str(options, "ktls,", OPTSTRING);
        if (peek_flag)
-               strncat(options, "peek,", OPTSTRING);
+               append_str(options, "peek,", OPTSTRING);
 }
 
 static int __test_exec(int cgrp, int test, struct sockmap_options *opt)