Commit af8a2b8b authored by Xin Long's avatar Xin Long Committed by David S. Miller

sctp: fix invalid reference to the index variable of the iterator

Now in sctp_apply_peer_addr_params(), if SPP_IPV6_FLOWLABEL flag is set
and trans is NULL, it would use trans as the index variable to traverse
transport_addr_list, then trans is set as the last transport of it.

Later, if SPP_DSCP flag is set, it would enter into the wrong branch as
trans is actually an invalid reference.

So fix it by using a new index variable to traverse transport_addr_list
for both SPP_DSCP and SPP_IPV6_FLOWLABEL flags process.

Fixes: 0b0dce7a ("sctp: add spp_ipv6_flowlabel and spp_dscp for sctp_paddrparams")
Reported-by: default avatarJulia Lawall <julia.lawall@lip6.fr>
Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent bf68066f
...@@ -2663,14 +2663,15 @@ static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params, ...@@ -2663,14 +2663,15 @@ static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params,
SCTP_FLOWLABEL_VAL_MASK; SCTP_FLOWLABEL_VAL_MASK;
trans->flowlabel |= SCTP_FLOWLABEL_SET_MASK; trans->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
} else if (asoc) { } else if (asoc) {
list_for_each_entry(trans, struct sctp_transport *t;
&asoc->peer.transport_addr_list,
list_for_each_entry(t, &asoc->peer.transport_addr_list,
transports) { transports) {
if (trans->ipaddr.sa.sa_family != AF_INET6) if (t->ipaddr.sa.sa_family != AF_INET6)
continue; continue;
trans->flowlabel = params->spp_ipv6_flowlabel & t->flowlabel = params->spp_ipv6_flowlabel &
SCTP_FLOWLABEL_VAL_MASK; SCTP_FLOWLABEL_VAL_MASK;
trans->flowlabel |= SCTP_FLOWLABEL_SET_MASK; t->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
} }
asoc->flowlabel = params->spp_ipv6_flowlabel & asoc->flowlabel = params->spp_ipv6_flowlabel &
SCTP_FLOWLABEL_VAL_MASK; SCTP_FLOWLABEL_VAL_MASK;
...@@ -2687,12 +2688,13 @@ static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params, ...@@ -2687,12 +2688,13 @@ static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params,
trans->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK; trans->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK;
trans->dscp |= SCTP_DSCP_SET_MASK; trans->dscp |= SCTP_DSCP_SET_MASK;
} else if (asoc) { } else if (asoc) {
list_for_each_entry(trans, struct sctp_transport *t;
&asoc->peer.transport_addr_list,
list_for_each_entry(t, &asoc->peer.transport_addr_list,
transports) { transports) {
trans->dscp = params->spp_dscp & t->dscp = params->spp_dscp &
SCTP_DSCP_VAL_MASK; SCTP_DSCP_VAL_MASK;
trans->dscp |= SCTP_DSCP_SET_MASK; t->dscp |= SCTP_DSCP_SET_MASK;
} }
asoc->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK; asoc->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK;
asoc->dscp |= SCTP_DSCP_SET_MASK; asoc->dscp |= SCTP_DSCP_SET_MASK;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment