Skip to content

Commit

Permalink
[SCTP] bug: sctp_assoc_control_transport() breakage
Browse files Browse the repository at this point in the history
a) struct sockaddr_storage * passed to sctp_ulpevent_make_peer_addr_change()
actually points at union sctp_addr field in a structure.  Then that sucker
gets copied to userland, with whatever junk we might have there.

b) it's actually having host-endian sin_port.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Al Viro authored and David S. Miller committed Dec 3, 2006
1 parent d5c747f commit 0906e20
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions net/sctp/associola.c
Original file line number Diff line number Diff line change
Expand Up @@ -709,6 +709,7 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
struct sctp_transport *first;
struct sctp_transport *second;
struct sctp_ulpevent *event;
struct sockaddr_storage addr;
struct list_head *pos;
int spc_state = 0;

Expand All @@ -731,8 +732,9 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
/* Generate and send a SCTP_PEER_ADDR_CHANGE notification to the
* user.
*/
event = sctp_ulpevent_make_peer_addr_change(asoc,
(struct sockaddr_storage *) &transport->ipaddr,
memset(&addr, 0, sizeof(struct sockaddr_storage));
flip_to_n((union sctp_addr *)&addr, &transport->ipaddr);
event = sctp_ulpevent_make_peer_addr_change(asoc, &addr,
0, spc_state, error, GFP_ATOMIC);
if (event)
sctp_ulpq_tail_event(&asoc->ulpq, event);
Expand Down

0 comments on commit 0906e20

Please sign in to comment.