aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2021-05-03 00:50:05 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2021-05-03 00:50:05 +0000
commit8b3d0f6439fa27f0d37a9a7b9d27bbfdfdf487c4 (patch)
treec8c5e5c6fcbf54aec45c9aca2cd3457394ab6197
parenta89481d328fd96ccbfa642e1db6d03825fa1dc6d (diff)
downloadsrc-8b3d0f6439fa27f0d37a9a7b9d27bbfdfdf487c4.tar.gz
src-8b3d0f6439fa27f0d37a9a7b9d27bbfdfdf487c4.zip
sctp: improve address list scanning
If the alternate address has to be removed, force the stack to find a new one, if it is still needed. MFC after: 3 days
-rw-r--r--sys/netinet/sctp_pcb.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c
index f4264ab387f1..08acccbf9185 100644
--- a/sys/netinet/sctp_pcb.c
+++ b/sys/netinet/sctp_pcb.c
@@ -6562,11 +6562,15 @@ next_param:
/* remove and free it */
stcb->asoc.numnets--;
TAILQ_REMOVE(&stcb->asoc.nets, net, sctp_next);
- sctp_free_remote_addr(net);
+ if (net == stcb->asoc.alternate) {
+ sctp_free_remote_addr(stcb->asoc.alternate);
+ stcb->asoc.alternate = NULL;
+ }
if (net == stcb->asoc.primary_destination) {
stcb->asoc.primary_destination = NULL;
sctp_select_primary_destination(stcb);
}
+ sctp_free_remote_addr(net);
}
}
if ((stcb->asoc.ecn_supported == 1) &&