Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 170a7e3e authored by Sean Young's avatar Sean Young Committed by Daniel Borkmann
Browse files

bpf: bpf_prog_array_copy() should return -ENOENT if exclude_prog not found



This makes is it possible for bpf prog detach to return -ENOENT.

Acked-by: default avatarYonghong Song <yhs@fb.com>
Signed-off-by: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent 9ce64f19
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -1616,6 +1616,7 @@ int bpf_prog_array_copy(struct bpf_prog_array __rcu *old_array,
	int new_prog_cnt, carry_prog_cnt = 0;
	struct bpf_prog **existing_prog;
	struct bpf_prog_array *array;
	bool found_exclude = false;
	int new_prog_idx = 0;

	/* Figure out how many existing progs we need to carry over to
@@ -1624,14 +1625,20 @@ int bpf_prog_array_copy(struct bpf_prog_array __rcu *old_array,
	if (old_array) {
		existing_prog = old_array->progs;
		for (; *existing_prog; existing_prog++) {
			if (*existing_prog != exclude_prog &&
			    *existing_prog != &dummy_bpf_prog.prog)
			if (*existing_prog == exclude_prog) {
				found_exclude = true;
				continue;
			}
			if (*existing_prog != &dummy_bpf_prog.prog)
				carry_prog_cnt++;
			if (*existing_prog == include_prog)
				return -EEXIST;
		}
	}

	if (exclude_prog && !found_exclude)
		return -ENOENT;

	/* How many progs (not NULL) will be in the new array? */
	new_prog_cnt = carry_prog_cnt;
	if (include_prog)
+2 −0
Original line number Diff line number Diff line
@@ -1006,6 +1006,8 @@ void perf_event_detach_bpf_prog(struct perf_event *event)

	old_array = event->tp_event->prog_array;
	ret = bpf_prog_array_copy(old_array, event->prog, NULL, &new_array);
	if (ret == -ENOENT)
		goto unlock;
	if (ret < 0) {
		bpf_prog_array_delete_safe(old_array, event->prog);
	} else {