sctp: Unwind address notifier registration on failure

sctp_v4_add_protocol() and sctp_v6_add_protocol() register their
address notifiers before registering the SCTP protocol handlers. If
protocol registration fails, the functions return without unregistering
the notifiers.

Unregister the notifiers on the protocol registration failure paths.
Also propagate notifier registration failures instead of ignoring them.

Signed-off-by: Yuho Choi <dbgh9129@gmail.com>
Link: https://patch.msgid.link/20260608162230.46644-1-dbgh9129@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Yuho Choi 2026-06-08 12:22:30 -04:00 committed by Jakub Kicinski
parent 1225253dc5
commit c8459ee2fe
2 changed files with 17 additions and 5 deletions

View File

@ -1176,11 +1176,17 @@ void sctp_v6_protosw_exit(void)
/* Register with inet6 layer. */
int sctp_v6_add_protocol(void)
{
/* Register notifier for inet6 address additions/deletions. */
register_inet6addr_notifier(&sctp_inet6addr_notifier);
int ret;
if (inet6_add_protocol(&sctpv6_protocol, IPPROTO_SCTP) < 0)
/* Register notifier for inet6 address additions/deletions. */
ret = register_inet6addr_notifier(&sctp_inet6addr_notifier);
if (ret)
return ret;
if (inet6_add_protocol(&sctpv6_protocol, IPPROTO_SCTP) < 0) {
unregister_inet6addr_notifier(&sctp_inet6addr_notifier);
return -EAGAIN;
}
return 0;
}

View File

@ -1263,12 +1263,18 @@ static void sctp_v4_protosw_exit(void)
static int sctp_v4_add_protocol(void)
{
int ret;
/* Register notifier for inet address additions/deletions. */
register_inetaddr_notifier(&sctp_inetaddr_notifier);
ret = register_inetaddr_notifier(&sctp_inetaddr_notifier);
if (ret)
return ret;
/* Register SCTP with inet layer. */
if (inet_add_protocol(&sctp_protocol, IPPROTO_SCTP) < 0)
if (inet_add_protocol(&sctp_protocol, IPPROTO_SCTP) < 0) {
unregister_inetaddr_notifier(&sctp_inetaddr_notifier);
return -EAGAIN;
}
return 0;
}