Patch "samples/bpf: syscall_tp_user: Fix array out-of-bound access" has been added to the 6.5-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    samples/bpf: syscall_tp_user: Fix array out-of-bound access

to the 6.5-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     samples-bpf-syscall_tp_user-fix-array-out-of-bound-a.patch
and it can be found in the queue-6.5 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 85d77ac629ccb2830f6d81ddc2219200e27febdd
Author: Jinghao Jia <jinghao@xxxxxxxxxxxxx>
Date:   Sun Sep 17 16:42:20 2023 -0500

    samples/bpf: syscall_tp_user: Fix array out-of-bound access
    
    [ Upstream commit 9220c3ef6fefbf18f24aeedb1142a642b3de0596 ]
    
    Commit 06744f24696e ("samples/bpf: Add openat2() enter/exit tracepoint
    to syscall_tp sample") added two more eBPF programs to support the
    openat2() syscall. However, it did not increase the size of the array
    that holds the corresponding bpf_links. This leads to an out-of-bound
    access on that array in the bpf_object__for_each_program loop and could
    corrupt other variables on the stack. On our testing QEMU, it corrupts
    the map1_fds array and causes the sample to fail:
    
      # ./syscall_tp
      prog #0: map ids 4 5
      verify map:4 val: 5
      map_lookup failed: Bad file descriptor
    
    Dynamically allocate the array based on the number of programs reported
    by libbpf to prevent similar inconsistencies in the future
    
    Fixes: 06744f24696e ("samples/bpf: Add openat2() enter/exit tracepoint to syscall_tp sample")
    Signed-off-by: Jinghao Jia <jinghao@xxxxxxxxxxxxx>
    Signed-off-by: Ruowen Qin <ruowenq2@xxxxxxxxxxxx>
    Signed-off-by: Jinghao Jia <jinghao7@xxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230917214220.637721-4-jinghao7@xxxxxxxxxxxx
    Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/samples/bpf/syscall_tp_user.c b/samples/bpf/syscall_tp_user.c
index 18c94c7e8a40e..7a09ac74fac07 100644
--- a/samples/bpf/syscall_tp_user.c
+++ b/samples/bpf/syscall_tp_user.c
@@ -48,7 +48,7 @@ static void verify_map(int map_id)
 static int test(char *filename, int nr_tests)
 {
 	int map0_fds[nr_tests], map1_fds[nr_tests], fd, i, j = 0;
-	struct bpf_link *links[nr_tests * 4];
+	struct bpf_link **links = NULL;
 	struct bpf_object *objs[nr_tests];
 	struct bpf_program *prog;
 
@@ -60,6 +60,19 @@ static int test(char *filename, int nr_tests)
 			goto cleanup;
 		}
 
+		/* One-time initialization */
+		if (!links) {
+			int nr_progs = 0;
+
+			bpf_object__for_each_program(prog, objs[i])
+				nr_progs += 1;
+
+			links = calloc(nr_progs * nr_tests, sizeof(struct bpf_link *));
+
+			if (!links)
+				goto cleanup;
+		}
+
 		/* load BPF program */
 		if (bpf_object__load(objs[i])) {
 			fprintf(stderr, "loading BPF object file failed\n");
@@ -107,8 +120,12 @@ static int test(char *filename, int nr_tests)
 	}
 
 cleanup:
-	for (j--; j >= 0; j--)
-		bpf_link__destroy(links[j]);
+	if (links) {
+		for (j--; j >= 0; j--)
+			bpf_link__destroy(links[j]);
+
+		free(links);
+	}
 
 	for (i--; i >= 0; i--)
 		bpf_object__close(objs[i]);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux