aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/sctp/associola.c12
-rw-r--r--net/sctp/sm_make_chunk.c15
-rw-r--r--net/sctp/socket.c13
3 files changed, 21 insertions, 19 deletions
diff --git a/net/sctp/associola.c b/net/sctp/associola.c
index 7824aeaa3d60..5b8971be9775 100644
--- a/net/sctp/associola.c
+++ b/net/sctp/associola.c
@@ -533,19 +533,17 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
533 struct sctp_transport *peer; 533 struct sctp_transport *peer;
534 struct sctp_sock *sp; 534 struct sctp_sock *sp;
535 unsigned short port; 535 unsigned short port;
536 union sctp_addr tmp;
537 flip_to_n(&tmp, addr);
538 536
539 sp = sctp_sk(asoc->base.sk); 537 sp = sctp_sk(asoc->base.sk);
540 538
541 /* AF_INET and AF_INET6 share common port field. */ 539 /* AF_INET and AF_INET6 share common port field. */
542 port = addr->v4.sin_port; 540 port = ntohs(addr->v4.sin_port);
543 541
544 SCTP_DEBUG_PRINTK_IPADDR("sctp_assoc_add_peer:association %p addr: ", 542 SCTP_DEBUG_PRINTK_IPADDR("sctp_assoc_add_peer:association %p addr: ",
545 " port: %d state:%d\n", 543 " port: %d state:%d\n",
546 asoc, 544 asoc,
547 addr, 545 addr,
548 addr->v4.sin_port, 546 port,
549 peer_state); 547 peer_state);
550 548
551 /* Set the port if it has not been set yet. */ 549 /* Set the port if it has not been set yet. */
@@ -553,7 +551,7 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
553 asoc->peer.port = port; 551 asoc->peer.port = port;
554 552
555 /* Check to see if this is a duplicate. */ 553 /* Check to see if this is a duplicate. */
556 peer = sctp_assoc_lookup_paddr(asoc, &tmp); 554 peer = sctp_assoc_lookup_paddr(asoc, addr);
557 if (peer) { 555 if (peer) {
558 if (peer->state == SCTP_UNKNOWN) { 556 if (peer->state == SCTP_UNKNOWN) {
559 if (peer_state == SCTP_ACTIVE) 557 if (peer_state == SCTP_ACTIVE)
@@ -564,7 +562,7 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
564 return peer; 562 return peer;
565 } 563 }
566 564
567 peer = sctp_transport_new(&tmp, gfp); 565 peer = sctp_transport_new(addr, gfp);
568 if (!peer) 566 if (!peer)
569 return NULL; 567 return NULL;
570 568
@@ -1070,7 +1068,7 @@ void sctp_assoc_update(struct sctp_association *asoc,
1070 trans = list_entry(pos, struct sctp_transport, 1068 trans = list_entry(pos, struct sctp_transport,
1071 transports); 1069 transports);
1072 if (!sctp_assoc_lookup_paddr(asoc, &trans->ipaddr)) 1070 if (!sctp_assoc_lookup_paddr(asoc, &trans->ipaddr))
1073 sctp_assoc_add_peer(asoc, &trans->ipaddr_h, 1071 sctp_assoc_add_peer(asoc, &trans->ipaddr,
1074 GFP_ATOMIC, trans->state); 1072 GFP_ATOMIC, trans->state);
1075 } 1073 }
1076 1074
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
index 632a1159610e..2c887d3f3911 100644
--- a/net/sctp/sm_make_chunk.c
+++ b/net/sctp/sm_make_chunk.c
@@ -1842,6 +1842,7 @@ int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid,
1842 struct sctp_transport *transport; 1842 struct sctp_transport *transport;
1843 struct list_head *pos, *temp; 1843 struct list_head *pos, *temp;
1844 char *cookie; 1844 char *cookie;
1845 union sctp_addr tmp;
1845 1846
1846 /* We must include the address that the INIT packet came from. 1847 /* We must include the address that the INIT packet came from.
1847 * This is the only address that matters for an INIT packet. 1848 * This is the only address that matters for an INIT packet.
@@ -1853,9 +1854,11 @@ int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid,
1853 * added as the primary transport. The source address seems to 1854 * added as the primary transport. The source address seems to
1854 * be a a better choice than any of the embedded addresses. 1855 * be a a better choice than any of the embedded addresses.
1855 */ 1856 */
1856 if (peer_addr) 1857 if (peer_addr) {
1857 if(!sctp_assoc_add_peer(asoc, peer_addr, gfp, SCTP_ACTIVE)) 1858 flip_to_n(&tmp, peer_addr);
1859 if(!sctp_assoc_add_peer(asoc, &tmp, gfp, SCTP_ACTIVE))
1858 goto nomem; 1860 goto nomem;
1861 }
1859 1862
1860 /* Process the initialization parameters. */ 1863 /* Process the initialization parameters. */
1861 1864
@@ -2016,6 +2019,7 @@ static int sctp_process_param(struct sctp_association *asoc,
2016 sctp_scope_t scope; 2019 sctp_scope_t scope;
2017 time_t stale; 2020 time_t stale;
2018 struct sctp_af *af; 2021 struct sctp_af *af;
2022 union sctp_addr tmp;
2019 2023
2020 /* We maintain all INIT parameters in network byte order all the 2024 /* We maintain all INIT parameters in network byte order all the
2021 * time. This allows us to not worry about whether the parameters 2025 * time. This allows us to not worry about whether the parameters
@@ -2029,9 +2033,10 @@ static int sctp_process_param(struct sctp_association *asoc,
2029 case SCTP_PARAM_IPV4_ADDRESS: 2033 case SCTP_PARAM_IPV4_ADDRESS:
2030 af = sctp_get_af_specific(param_type2af(param.p->type)); 2034 af = sctp_get_af_specific(param_type2af(param.p->type));
2031 af->from_addr_param(&addr, param.addr, asoc->peer.port, 0); 2035 af->from_addr_param(&addr, param.addr, asoc->peer.port, 0);
2036 flip_to_n(&tmp, &addr);
2032 scope = sctp_scope(peer_addr); 2037 scope = sctp_scope(peer_addr);
2033 if (sctp_in_scope(&addr, scope)) 2038 if (sctp_in_scope(&tmp, scope))
2034 if (!sctp_assoc_add_peer(asoc, &addr, gfp, SCTP_UNCONFIRMED)) 2039 if (!sctp_assoc_add_peer(asoc, &tmp, gfp, SCTP_UNCONFIRMED))
2035 return 0; 2040 return 0;
2036 break; 2041 break;
2037 2042
@@ -2434,7 +2439,7 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
2434 * Due to Resource Shortage'. 2439 * Due to Resource Shortage'.
2435 */ 2440 */
2436 2441
2437 peer = sctp_assoc_add_peer(asoc, &addr, GFP_ATOMIC, SCTP_UNCONFIRMED); 2442 peer = sctp_assoc_add_peer(asoc, &tmp_addr, GFP_ATOMIC, SCTP_UNCONFIRMED);
2438 if (!peer) 2443 if (!peer)
2439 return SCTP_ERROR_RSRC_LOW; 2444 return SCTP_ERROR_RSRC_LOW;
2440 2445
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index f00b03845247..3dd7ada8026c 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -969,7 +969,7 @@ static int __sctp_connect(struct sock* sk,
969 int err = 0; 969 int err = 0;
970 int addrcnt = 0; 970 int addrcnt = 0;
971 int walk_size = 0; 971 int walk_size = 0;
972 struct sockaddr *sa_addr; 972 union sctp_addr *sa_addr;
973 void *addr_buf; 973 void *addr_buf;
974 974
975 sp = sctp_sk(sk); 975 sp = sctp_sk(sk);
@@ -989,8 +989,8 @@ static int __sctp_connect(struct sock* sk,
989 /* Walk through the addrs buffer and count the number of addresses. */ 989 /* Walk through the addrs buffer and count the number of addresses. */
990 addr_buf = kaddrs; 990 addr_buf = kaddrs;
991 while (walk_size < addrs_size) { 991 while (walk_size < addrs_size) {
992 sa_addr = (struct sockaddr *)addr_buf; 992 sa_addr = (union sctp_addr *)addr_buf;
993 af = sctp_get_af_specific(sa_addr->sa_family); 993 af = sctp_get_af_specific(sa_addr->sa.sa_family);
994 994
995 /* If the address family is not supported or if this address 995 /* If the address family is not supported or if this address
996 * causes the address buffer to overflow return EINVAL. 996 * causes the address buffer to overflow return EINVAL.
@@ -1000,8 +1000,7 @@ static int __sctp_connect(struct sock* sk,
1000 goto out_free; 1000 goto out_free;
1001 } 1001 }
1002 1002
1003 err = sctp_verify_addr(sk, (union sctp_addr *)sa_addr, 1003 err = sctp_verify_addr(sk, sa_addr, af->sockaddr_len);
1004 af->sockaddr_len);
1005 if (err) 1004 if (err)
1006 goto out_free; 1005 goto out_free;
1007 1006
@@ -1064,7 +1063,7 @@ static int __sctp_connect(struct sock* sk,
1064 } 1063 }
1065 1064
1066 /* Prime the peer's transport structures. */ 1065 /* Prime the peer's transport structures. */
1067 transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL, 1066 transport = sctp_assoc_add_peer(asoc, sa_addr, GFP_KERNEL,
1068 SCTP_UNKNOWN); 1067 SCTP_UNKNOWN);
1069 if (!transport) { 1068 if (!transport) {
1070 err = -ENOMEM; 1069 err = -ENOMEM;
@@ -1618,7 +1617,7 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
1618 } 1617 }
1619 1618
1620 /* Prime the peer's transport structures. */ 1619 /* Prime the peer's transport structures. */
1621 transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL, SCTP_UNKNOWN); 1620 transport = sctp_assoc_add_peer(asoc, &tmp, GFP_KERNEL, SCTP_UNKNOWN);
1622 if (!transport) { 1621 if (!transport) {
1623 err = -ENOMEM; 1622 err = -ENOMEM;
1624 goto out_free; 1623 goto out_free;