mirror of
https://github.com/torvalds/linux.git
synced 2026-09-12 04:23:03 +02:00
mptcp: pm: userspace: fix address ID overflow
When all MPTCP address IDs (1-255) are exhausted in the userspace PM,
find_next_zero_bit() returns MPTCP_PM_MAX_ADDR_ID + 1 (256). This value
overflows when stored in the u8 field e->addr.id, resulting in ID 0
being stored and the entry being incorrectly added to the list.
ID 0 is reserved for the initial connection in MPTCP, so this overflow
can cause address conflicts.
Note: the in-kernel PM already has an 'endpoints == MPTCP_PM_MAX_ADDR_ID'
check in mptcp_pm_nl_append_new_local_addr() that returns -ERANGE before
reaching find_next_zero_bit(), preventing this overflow. So this fix only
addresses the userspace PM path.
Check the find_next_zero_bit() result against MPTCP_PM_MAX_ADDR_ID and
return -ENOSPC if all IDs are truly exhausted. Move the ID allocation
check before the memory allocation so that the error path does not need
to free the allocated entry.
Fixes: 4638de5aef ("mptcp: handle local addrs announced by userspace PMs")
Cc: stable@vger.kernel.org
Signed-off-by: Qing Luo <luoqing@kylinos.cn>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20260908-net-mptcp-misc-fixes-7-3-rc1-v2-8-df1de70348b6@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
730444f094
commit
f9f0068e88
|
|
@ -69,6 +69,19 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
|
|||
}
|
||||
|
||||
if (!addr_match && !id_match) {
|
||||
unsigned int id;
|
||||
|
||||
if (!entry->addr.id && needs_id) {
|
||||
id = find_next_zero_bit(id_bitmap,
|
||||
MPTCP_PM_MAX_ADDR_ID + 1, 1);
|
||||
if (id > MPTCP_PM_MAX_ADDR_ID) {
|
||||
ret = -ENOSPC;
|
||||
goto append_err;
|
||||
}
|
||||
} else {
|
||||
id = entry->addr.id;
|
||||
}
|
||||
|
||||
/* Memory for the entry is allocated from the
|
||||
* sock option buffer.
|
||||
*/
|
||||
|
|
@ -78,10 +91,7 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
|
|||
goto append_err;
|
||||
}
|
||||
|
||||
if (!e->addr.id && needs_id)
|
||||
e->addr.id = find_next_zero_bit(id_bitmap,
|
||||
MPTCP_PM_MAX_ADDR_ID + 1,
|
||||
1);
|
||||
e->addr.id = id;
|
||||
list_add_tail_rcu(&e->list, &msk->pm.userspace_pm_local_addr_list);
|
||||
msk->pm.local_addr_used++;
|
||||
ret = e->addr.id;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user