Skip to content

Commit c24b75e

Browse files
edumazethorms
authored andcommitted
ipvs: move old_secure_tcp into struct netns_ipvs
syzbot reported the following issue : BUG: KCSAN: data-race in update_defense_level / update_defense_level read to 0xffffffff861a6260 of 4 bytes by task 3006 on cpu 1: update_defense_level+0x621/0xb30 net/netfilter/ipvs/ip_vs_ctl.c:177 defense_work_handler+0x3d/0xd0 net/netfilter/ipvs/ip_vs_ctl.c:225 process_one_work+0x3d4/0x890 kernel/workqueue.c:2269 worker_thread+0xa0/0x800 kernel/workqueue.c:2415 kthread+0x1d4/0x200 drivers/block/aoe/aoecmd.c:1253 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:352 write to 0xffffffff861a6260 of 4 bytes by task 7333 on cpu 0: update_defense_level+0xa62/0xb30 net/netfilter/ipvs/ip_vs_ctl.c:205 defense_work_handler+0x3d/0xd0 net/netfilter/ipvs/ip_vs_ctl.c:225 process_one_work+0x3d4/0x890 kernel/workqueue.c:2269 worker_thread+0xa0/0x800 kernel/workqueue.c:2415 kthread+0x1d4/0x200 drivers/block/aoe/aoecmd.c:1253 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:352 Reported by Kernel Concurrency Sanitizer on: CPU: 0 PID: 7333 Comm: kworker/0:5 Not tainted 5.4.0-rc3+ #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Workqueue: events defense_work_handler Indeed, old_secure_tcp is currently a static variable, while it needs to be a per netns variable. Fixes: a0840e2 ("IPVS: netns, ip_vs_ctl local vars moved to ipvs struct.") Signed-off-by: Eric Dumazet <[email protected]> Reported-by: syzbot <[email protected]> Signed-off-by: Simon Horman <[email protected]>
1 parent 62931f5 commit c24b75e

File tree

2 files changed

+8
-8
lines changed

2 files changed

+8
-8
lines changed

include/net/ip_vs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,7 @@ struct netns_ipvs {
889889
struct delayed_work defense_work; /* Work handler */
890890
int drop_rate;
891891
int drop_counter;
892+
int old_secure_tcp;
892893
atomic_t dropentry;
893894
/* locks in ctl.c */
894895
spinlock_t dropentry_lock; /* drop entry handling */

net/netfilter/ipvs/ip_vs_ctl.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ static bool __ip_vs_addr_is_local_v6(struct net *net,
9393
static void update_defense_level(struct netns_ipvs *ipvs)
9494
{
9595
struct sysinfo i;
96-
static int old_secure_tcp = 0;
9796
int availmem;
9897
int nomem;
9998
int to_change = -1;
@@ -174,35 +173,35 @@ static void update_defense_level(struct netns_ipvs *ipvs)
174173
spin_lock(&ipvs->securetcp_lock);
175174
switch (ipvs->sysctl_secure_tcp) {
176175
case 0:
177-
if (old_secure_tcp >= 2)
176+
if (ipvs->old_secure_tcp >= 2)
178177
to_change = 0;
179178
break;
180179
case 1:
181180
if (nomem) {
182-
if (old_secure_tcp < 2)
181+
if (ipvs->old_secure_tcp < 2)
183182
to_change = 1;
184183
ipvs->sysctl_secure_tcp = 2;
185184
} else {
186-
if (old_secure_tcp >= 2)
185+
if (ipvs->old_secure_tcp >= 2)
187186
to_change = 0;
188187
}
189188
break;
190189
case 2:
191190
if (nomem) {
192-
if (old_secure_tcp < 2)
191+
if (ipvs->old_secure_tcp < 2)
193192
to_change = 1;
194193
} else {
195-
if (old_secure_tcp >= 2)
194+
if (ipvs->old_secure_tcp >= 2)
196195
to_change = 0;
197196
ipvs->sysctl_secure_tcp = 1;
198197
}
199198
break;
200199
case 3:
201-
if (old_secure_tcp < 2)
200+
if (ipvs->old_secure_tcp < 2)
202201
to_change = 1;
203202
break;
204203
}
205-
old_secure_tcp = ipvs->sysctl_secure_tcp;
204+
ipvs->old_secure_tcp = ipvs->sysctl_secure_tcp;
206205
if (to_change >= 0)
207206
ip_vs_protocol_timeout_change(ipvs,
208207
ipvs->sysctl_secure_tcp > 1);

0 commit comments

Comments
 (0)