Commit fbe81680 authored by Wang Liang's avatar Wang Liang
Browse files

pktgen: use cpus_read_lock() in pg_net_init()

mainline inclusion
from mainline-v6.11-rc6
commit 979b581e4c69257acab1af415ddad6b2d78a2fa5
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IAR4B3
CVE: CVE-2024-46681

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=979b581e4c69257acab1af415ddad6b2d78a2fa5



--------------------------------

We must use cpus_read_lock()/cpus_read_unlock()
around the for_each_online_cpu(cpu) loop.

While we are at it use WARN_ON_ONCE() to avoid a possible syslog flood.

Fixes: 1da177e4 ("Linux-2.6.12-rc2")
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20240821175339.1191779-1-edumazet@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Conflicts:
        net/core/pktgen.c
[conflicts due to not mergered f568a3d49af9 ("bpf,lsm: Add BPF token LSM hooks")
which include linux/bpf.h, and lead to inclusion of linux/cpu.h indirectly. The
commit(f568a3d49af9) is complex and irrelevant to this problem. To solve the
compile error, include linux/cpu.h manually.]
Signed-off-by: default avatarWang Liang <wangliang74@huawei.com>
parent 16dfd8c8
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -170,6 +170,7 @@
#include <linux/uaccess.h>
#include <asm/dma.h>
#include <asm/div64.h>		/* do_div */
#include <linux/cpu.h>

#define VERSION	"2.75"
#define IP_NAME_SZ 32
@@ -3605,7 +3606,7 @@ static int pktgen_thread_worker(void *arg)
	struct pktgen_dev *pkt_dev = NULL;
	int cpu = t->cpu;

	WARN_ON(smp_processor_id() != cpu);
	WARN_ON_ONCE(smp_processor_id() != cpu);

	init_waitqueue_head(&t->queue);
	complete(&t->start_done);
@@ -3941,6 +3942,7 @@ static int __net_init pg_net_init(struct net *net)
		goto remove;
	}

	cpus_read_lock();
	for_each_online_cpu(cpu) {
		int err;

@@ -3949,6 +3951,7 @@ static int __net_init pg_net_init(struct net *net)
			pr_warn("Cannot create thread for cpu %d (%d)\n",
				   cpu, err);
	}
	cpus_read_unlock();

	if (list_empty(&pn->pktgen_threads)) {
		pr_err("Initialization failed for all threads\n");