mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-18 03:06:43 +00:00
inet_diag: annotate data-races around inet_diag_table[]
inet_diag_lock_handler() reads inet_diag_table[proto] locklessly. Use READ_ONCE()/WRITE_ONCE() annotations to avoid potential issues. Fixes: d523a328fb02 ("[INET]: Fix inet_diag dead-lock regression") Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Guillaume Nault <gnault@redhat.com> Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com> Reviewed-by: Willem de Bruijn <willemb@google.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
efd4025376
commit
e50e10ae5d
@ -57,7 +57,7 @@ static const struct inet_diag_handler *inet_diag_lock_handler(int proto)
|
||||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
|
||||
if (!inet_diag_table[proto])
|
||||
if (!READ_ONCE(inet_diag_table[proto]))
|
||||
sock_load_diag_module(AF_INET, proto);
|
||||
|
||||
mutex_lock(&inet_diag_table_mutex);
|
||||
@ -1503,7 +1503,7 @@ int inet_diag_register(const struct inet_diag_handler *h)
|
||||
mutex_lock(&inet_diag_table_mutex);
|
||||
err = -EEXIST;
|
||||
if (!inet_diag_table[type]) {
|
||||
inet_diag_table[type] = h;
|
||||
WRITE_ONCE(inet_diag_table[type], h);
|
||||
err = 0;
|
||||
}
|
||||
mutex_unlock(&inet_diag_table_mutex);
|
||||
@ -1520,7 +1520,7 @@ void inet_diag_unregister(const struct inet_diag_handler *h)
|
||||
return;
|
||||
|
||||
mutex_lock(&inet_diag_table_mutex);
|
||||
inet_diag_table[type] = NULL;
|
||||
WRITE_ONCE(inet_diag_table[type], NULL);
|
||||
mutex_unlock(&inet_diag_table_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(inet_diag_unregister);
|
||||
|
Loading…
x
Reference in New Issue
Block a user