mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
sctp: set chunk transport correctly when it's a new asoc
[ Upstream commit4ff40b8626] In the paths: sctp_sf_do_unexpected_init() -> sctp_make_init_ack() sctp_sf_do_dupcook_a/b()() -> sctp_sf_do_5_1D_ce() The new chunk 'retval' transport is set from the incoming chunk 'chunk' transport. However, 'retval' transport belong to the new asoc, which is a different one from 'chunk' transport's asoc. It will cause that the 'retval' chunk gets set with a wrong transport. Later when sending it and because of Commitb9fd683982("sctp: add sctp_packet_singleton"), sctp_packet_singleton() will set some fields, like vtag to 'retval' chunk from that wrong transport's asoc. This patch is to fix it by setting 'retval' transport correctly which belongs to the right asoc in sctp_make_init_ack() and sctp_sf_do_5_1D_ce(). Fixes:b9fd683982("sctp: add sctp_packet_singleton") Reported-by: Ying Xu <yinxu@redhat.com> Signed-off-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
a188f56859
commit
cbf23d40ce
@@ -495,7 +495,10 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc,
|
||||
*
|
||||
* [INIT ACK back to where the INIT came from.]
|
||||
*/
|
||||
retval->transport = chunk->transport;
|
||||
if (chunk->transport)
|
||||
retval->transport =
|
||||
sctp_assoc_lookup_paddr(asoc,
|
||||
&chunk->transport->ipaddr);
|
||||
|
||||
retval->subh.init_hdr =
|
||||
sctp_addto_chunk(retval, sizeof(initack), &initack);
|
||||
@@ -642,8 +645,10 @@ struct sctp_chunk *sctp_make_cookie_ack(const struct sctp_association *asoc,
|
||||
*
|
||||
* [COOKIE ACK back to where the COOKIE ECHO came from.]
|
||||
*/
|
||||
if (retval && chunk)
|
||||
retval->transport = chunk->transport;
|
||||
if (retval && chunk && chunk->transport)
|
||||
retval->transport =
|
||||
sctp_assoc_lookup_paddr(asoc,
|
||||
&chunk->transport->ipaddr);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user