mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
Merge branch 'tipc-fix-netlink-gate-and-receive-path-bugs'
Michael Bommarito says: ==================== tipc: fix netlink gate and receive-path bugs This is v4 of the public TIPC series. The only change from v3 is in patch 1: TIPC_NL_MEDIA_SET now uses GENL_UNS_ADMIN_PERM like the other mutators, instead of GENL_ADMIN_PERM, so the whole series uses the namespace-aware CAP_NET_ADMIN check that matches the legacy TIPC netlink path. Patches 2 and 3 are unchanged. Patch 1 gives the TIPCv2 mutating generic-netlink operations the admin gate the legacy API already has, so a local unprivileged process can no longer change TIPC state. Patch 2 drops CONN_ACK messages that acknowledge more outstanding sends than exist, preventing the snt_unacked underflow. Patch 3 rejects peer bindings with lower > upper, which would otherwise leak binding-table memory. ==================== Link: https://patch.msgid.link/20260610124003.3831170-1-michael.bommarito@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
9bf1003289
|
|
@ -280,12 +280,21 @@ static bool tipc_update_nametbl(struct net *net, struct distr_item *i,
|
|||
u32 node, u32 dtype)
|
||||
{
|
||||
struct publication *p = NULL;
|
||||
u32 lower = ntohl(i->lower);
|
||||
u32 upper = ntohl(i->upper);
|
||||
struct tipc_socket_addr sk;
|
||||
struct tipc_uaddr ua;
|
||||
u32 key = ntohl(i->key);
|
||||
struct tipc_uaddr ua;
|
||||
|
||||
/* A peer-advertised binding with lower > upper can never be matched
|
||||
* or withdrawn and would leak the publication; the local bind path
|
||||
* rejects such ranges, so reject ranges learned from the network too.
|
||||
*/
|
||||
if (lower > upper)
|
||||
return false;
|
||||
|
||||
tipc_uaddr(&ua, TIPC_SERVICE_RANGE, TIPC_CLUSTER_SCOPE,
|
||||
ntohl(i->type), ntohl(i->lower), ntohl(i->upper));
|
||||
ntohl(i->type), lower, upper);
|
||||
sk.ref = ntohl(i->port);
|
||||
sk.node = node;
|
||||
|
||||
|
|
|
|||
|
|
@ -152,11 +152,13 @@ static const struct genl_ops tipc_genl_v2_ops[] = {
|
|||
{
|
||||
.cmd = TIPC_NL_BEARER_DISABLE,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.doit = tipc_nl_bearer_disable,
|
||||
},
|
||||
{
|
||||
.cmd = TIPC_NL_BEARER_ENABLE,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.doit = tipc_nl_bearer_enable,
|
||||
},
|
||||
{
|
||||
|
|
@ -168,11 +170,13 @@ static const struct genl_ops tipc_genl_v2_ops[] = {
|
|||
{
|
||||
.cmd = TIPC_NL_BEARER_ADD,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.doit = tipc_nl_bearer_add,
|
||||
},
|
||||
{
|
||||
.cmd = TIPC_NL_BEARER_SET,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.doit = tipc_nl_bearer_set,
|
||||
},
|
||||
{
|
||||
|
|
@ -197,11 +201,13 @@ static const struct genl_ops tipc_genl_v2_ops[] = {
|
|||
{
|
||||
.cmd = TIPC_NL_LINK_SET,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.doit = tipc_nl_node_set_link,
|
||||
},
|
||||
{
|
||||
.cmd = TIPC_NL_LINK_RESET_STATS,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.doit = tipc_nl_node_reset_link_stats,
|
||||
},
|
||||
{
|
||||
|
|
@ -213,6 +219,7 @@ static const struct genl_ops tipc_genl_v2_ops[] = {
|
|||
{
|
||||
.cmd = TIPC_NL_MEDIA_SET,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.doit = tipc_nl_media_set,
|
||||
},
|
||||
{
|
||||
|
|
@ -228,6 +235,7 @@ static const struct genl_ops tipc_genl_v2_ops[] = {
|
|||
{
|
||||
.cmd = TIPC_NL_NET_SET,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.doit = tipc_nl_net_set,
|
||||
},
|
||||
{
|
||||
|
|
@ -238,6 +246,7 @@ static const struct genl_ops tipc_genl_v2_ops[] = {
|
|||
{
|
||||
.cmd = TIPC_NL_MON_SET,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.doit = tipc_nl_node_set_monitor,
|
||||
},
|
||||
{
|
||||
|
|
@ -255,6 +264,7 @@ static const struct genl_ops tipc_genl_v2_ops[] = {
|
|||
{
|
||||
.cmd = TIPC_NL_PEER_REMOVE,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.doit = tipc_nl_peer_rm,
|
||||
},
|
||||
#ifdef CONFIG_TIPC_MEDIA_UDP
|
||||
|
|
@ -269,11 +279,13 @@ static const struct genl_ops tipc_genl_v2_ops[] = {
|
|||
{
|
||||
.cmd = TIPC_NL_KEY_SET,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.doit = tipc_nl_node_set_key,
|
||||
},
|
||||
{
|
||||
.cmd = TIPC_NL_KEY_FLUSH,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.doit = tipc_nl_node_flush_key,
|
||||
},
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1362,6 +1362,9 @@ static void tipc_sk_conn_proto_rcv(struct tipc_sock *tsk, struct sk_buff *skb,
|
|||
__skb_queue_tail(xmitq, skb);
|
||||
return;
|
||||
} else if (mtyp == CONN_ACK) {
|
||||
if (tsk->snt_unacked < msg_conn_ack(hdr))
|
||||
goto exit;
|
||||
|
||||
was_cong = tsk_conn_cong(tsk);
|
||||
tipc_sk_push_backlog(tsk, msg_nagle_ack(hdr));
|
||||
tsk->snt_unacked -= msg_conn_ack(hdr);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user