cmdline_contains is used by BPF selftests to check the presence of
specific kernel commandline parameters, but it currently suffers from
two issues:
- the read commandline isn't NULL terminated right after the read data
  but only at the end of the buffer, leaving uninitialized bytes that
  are then possibly tokenized
- the comparison of found tokens is done based on the size of found
  token. This could lead to too-short-but-matching tokens to wrongly
  match the search pattern.

Enforce stricter checks in cmdline_contains to avoid accidental matches.

Fixes: 399f6185a1c0 ("selftests/bpf: Fix selftests broken by mitigations=off")
Signed-off-by: Alexis LothorĂ© (eBPF Foundation) <[email protected]>
---
Changes in v7:
- add missing Fixes tag
- drop unneeded size check, already done by strcmp
---
 tools/testing/selftests/bpf/unpriv_helpers.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/bpf/unpriv_helpers.c 
b/tools/testing/selftests/bpf/unpriv_helpers.c
index f997d7ec8fd0..9dadcacaef0c 100644
--- a/tools/testing/selftests/bpf/unpriv_helpers.c
+++ b/tools/testing/selftests/bpf/unpriv_helpers.c
@@ -72,8 +72,8 @@ static int config_contains(const char *pat)
 
 static bool cmdline_contains(const char *pat)
 {
+       int fd, cnt, ret = false;
        char cmdline[4096], *c;
-       int fd, ret = false;
 
        fd = open("/proc/cmdline", O_RDONLY);
        if (fd < 0) {
@@ -81,14 +81,15 @@ static bool cmdline_contains(const char *pat)
                return false;
        }
 
-       if (read(fd, cmdline, sizeof(cmdline) - 1) < 0) {
+       cnt = read(fd, cmdline, sizeof(cmdline) - 1);
+       if (cnt < 0) {
                perror("read /proc/cmdline");
                goto out;
        }
 
-       cmdline[sizeof(cmdline) - 1] = '\0';
+       cmdline[cnt] = '\0';
        for (c = strtok(cmdline, " \n"); c; c = strtok(NULL, " \n")) {
-               if (strncmp(c, pat, strlen(c)))
+               if (strcmp(c, pat))
                        continue;
                ret = true;
                break;

-- 
2.55.0


Reply via email to