mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
inet_diag: annotate data-races around inet_diag_table[]
[ Upstream commit e50e10ae5d81ddb41547114bfdc5edc04422f082 ]
inet_diag_lock_handler() reads inet_diag_table[proto] locklessly.
Use READ_ONCE()/WRITE_ONCE() annotations to avoid potential issues.
Fixes: d523a328fb ("[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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Sasha Levin
parent
f7dbf2c167
commit
d10dbf722d
@@ -57,7 +57,7 @@ static const struct inet_diag_handler *inet_diag_lock_handler(int proto)
|
|||||||
return ERR_PTR(-ENOENT);
|
return ERR_PTR(-ENOENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!inet_diag_table[proto])
|
if (!READ_ONCE(inet_diag_table[proto]))
|
||||||
sock_load_diag_module(AF_INET, proto);
|
sock_load_diag_module(AF_INET, proto);
|
||||||
|
|
||||||
mutex_lock(&inet_diag_table_mutex);
|
mutex_lock(&inet_diag_table_mutex);
|
||||||
@@ -1419,7 +1419,7 @@ int inet_diag_register(const struct inet_diag_handler *h)
|
|||||||
mutex_lock(&inet_diag_table_mutex);
|
mutex_lock(&inet_diag_table_mutex);
|
||||||
err = -EEXIST;
|
err = -EEXIST;
|
||||||
if (!inet_diag_table[type]) {
|
if (!inet_diag_table[type]) {
|
||||||
inet_diag_table[type] = h;
|
WRITE_ONCE(inet_diag_table[type], h);
|
||||||
err = 0;
|
err = 0;
|
||||||
}
|
}
|
||||||
mutex_unlock(&inet_diag_table_mutex);
|
mutex_unlock(&inet_diag_table_mutex);
|
||||||
@@ -1436,7 +1436,7 @@ void inet_diag_unregister(const struct inet_diag_handler *h)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
mutex_lock(&inet_diag_table_mutex);
|
mutex_lock(&inet_diag_table_mutex);
|
||||||
inet_diag_table[type] = NULL;
|
WRITE_ONCE(inet_diag_table[type], NULL);
|
||||||
mutex_unlock(&inet_diag_table_mutex);
|
mutex_unlock(&inet_diag_table_mutex);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(inet_diag_unregister);
|
EXPORT_SYMBOL_GPL(inet_diag_unregister);
|
||||||
|
|||||||
Reference in New Issue
Block a user