diff options
author | Breno Leitao <leitao@debian.org> | 2024-07-12 07:34:15 -0700 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2024-07-14 07:38:44 -0700 |
commit | 97d9fba9a812cada5484667a46e14a4c976ca330 (patch) | |
tree | 3d56b4f8e57dbdcae0ee5648335ed9c8599a1750 /drivers/net/netconsole.c | |
parent | d657f5c76c47eca50dd61b5c1e150dac05e07046 (diff) | |
download | linux-97d9fba9a812cada5484667a46e14a4c976ca330.tar.gz linux-97d9fba9a812cada5484667a46e14a4c976ca330.tar.bz2 linux-97d9fba9a812cada5484667a46e14a4c976ca330.zip |
net: netconsole: Disable target before netpoll cleanup
Currently, netconsole cleans up the netpoll structure before disabling
the target. This approach can lead to race conditions, as message
senders (write_ext_msg() and write_msg()) check if the target is
enabled before using netpoll. The sender can validate that the target is
enabled, but, the netpoll might be de-allocated already, causing
undesired behaviours.
This patch reverses the order of operations:
1. Disable the target
2. Clean up the netpoll structure
This change eliminates the potential race condition, ensuring that
no messages are sent through a partially cleaned-up netpoll structure.
Fixes: 2382b15bcc39 ("netconsole: take care of NETDEV_UNREGISTER event")
Cc: stable@vger.kernel.org
Signed-off-by: Breno Leitao <leitao@debian.org>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20240712143415.1141039-1-leitao@debian.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'drivers/net/netconsole.c')
-rw-r--r-- | drivers/net/netconsole.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index d7070dd4fe73..aa66c923790f 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -974,6 +974,7 @@ restart: /* rtnl_lock already held * we might sleep in __netpoll_cleanup() */ + nt->enabled = false; spin_unlock_irqrestore(&target_list_lock, flags); __netpoll_cleanup(&nt->np); @@ -981,7 +982,6 @@ restart: spin_lock_irqsave(&target_list_lock, flags); netdev_put(nt->np.dev, &nt->np.dev_tracker); nt->np.dev = NULL; - nt->enabled = false; stopped = true; netconsole_target_put(nt); goto restart; |