diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/8021q/vlan.c | 7 | ||||
| -rw-r--r-- | net/bluetooth/hci_conn.c | 1 | ||||
| -rw-r--r-- | net/bluetooth/l2cap.c | 13 | ||||
| -rw-r--r-- | net/core/dev.c | 11 | ||||
| -rw-r--r-- | net/core/skbuff.c | 3 | ||||
| -rw-r--r-- | net/ipv4/ipmr.c | 4 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 19 | ||||
| -rw-r--r-- | net/sctp/associola.c | 4 | ||||
| -rw-r--r-- | net/sctp/sm_statefuns.c | 15 | ||||
| -rw-r--r-- | net/sctp/socket.c | 40 | ||||
| -rw-r--r-- | net/sctp/transport.c | 3 |
11 files changed, 75 insertions, 45 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 8836575f9d7..a29c5ab5815 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
| @@ -281,8 +281,11 @@ out_uninit_applicant: | |||
| 281 | if (ngrp) | 281 | if (ngrp) |
| 282 | vlan_gvrp_uninit_applicant(real_dev); | 282 | vlan_gvrp_uninit_applicant(real_dev); |
| 283 | out_free_group: | 283 | out_free_group: |
| 284 | if (ngrp) | 284 | if (ngrp) { |
| 285 | vlan_group_free(ngrp); | 285 | hlist_del_rcu(&ngrp->hlist); |
| 286 | /* Free the group, after all cpu's are done. */ | ||
| 287 | call_rcu(&ngrp->rcu, vlan_rcu_free); | ||
| 288 | } | ||
| 286 | return err; | 289 | return err; |
| 287 | } | 290 | } |
| 288 | 291 | ||
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index a9750984f77..b7c4224f4e7 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
| @@ -211,6 +211,7 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) | |||
| 211 | conn->type = type; | 211 | conn->type = type; |
| 212 | conn->mode = HCI_CM_ACTIVE; | 212 | conn->mode = HCI_CM_ACTIVE; |
| 213 | conn->state = BT_OPEN; | 213 | conn->state = BT_OPEN; |
| 214 | conn->auth_type = HCI_AT_GENERAL_BONDING; | ||
| 214 | 215 | ||
| 215 | conn->power_save = 1; | 216 | conn->power_save = 1; |
| 216 | conn->disc_timeout = HCI_DISCONN_TIMEOUT; | 217 | conn->disc_timeout = HCI_DISCONN_TIMEOUT; |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 77e9fb130ad..947f8bbb4bb 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
| @@ -2205,7 +2205,7 @@ static int l2cap_build_conf_req(struct sock *sk, void *data) | |||
| 2205 | { | 2205 | { |
| 2206 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 2206 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
| 2207 | struct l2cap_conf_req *req = data; | 2207 | struct l2cap_conf_req *req = data; |
| 2208 | struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_ERTM }; | 2208 | struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC }; |
| 2209 | void *ptr = req->data; | 2209 | void *ptr = req->data; |
| 2210 | 2210 | ||
| 2211 | BT_DBG("sk %p", sk); | 2211 | BT_DBG("sk %p", sk); |
| @@ -2394,6 +2394,10 @@ done: | |||
| 2394 | rfc.monitor_timeout = L2CAP_DEFAULT_MONITOR_TO; | 2394 | rfc.monitor_timeout = L2CAP_DEFAULT_MONITOR_TO; |
| 2395 | 2395 | ||
| 2396 | pi->conf_state |= L2CAP_CONF_MODE_DONE; | 2396 | pi->conf_state |= L2CAP_CONF_MODE_DONE; |
| 2397 | |||
| 2398 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, | ||
| 2399 | sizeof(rfc), (unsigned long) &rfc); | ||
| 2400 | |||
| 2397 | break; | 2401 | break; |
| 2398 | 2402 | ||
| 2399 | case L2CAP_MODE_STREAMING: | 2403 | case L2CAP_MODE_STREAMING: |
| @@ -2401,6 +2405,10 @@ done: | |||
| 2401 | pi->max_pdu_size = rfc.max_pdu_size; | 2405 | pi->max_pdu_size = rfc.max_pdu_size; |
| 2402 | 2406 | ||
| 2403 | pi->conf_state |= L2CAP_CONF_MODE_DONE; | 2407 | pi->conf_state |= L2CAP_CONF_MODE_DONE; |
| 2408 | |||
| 2409 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, | ||
| 2410 | sizeof(rfc), (unsigned long) &rfc); | ||
| 2411 | |||
| 2404 | break; | 2412 | break; |
| 2405 | 2413 | ||
| 2406 | default: | 2414 | default: |
| @@ -2410,9 +2418,6 @@ done: | |||
| 2410 | rfc.mode = pi->mode; | 2418 | rfc.mode = pi->mode; |
| 2411 | } | 2419 | } |
| 2412 | 2420 | ||
| 2413 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, | ||
| 2414 | sizeof(rfc), (unsigned long) &rfc); | ||
| 2415 | |||
| 2416 | if (result == L2CAP_CONF_SUCCESS) | 2421 | if (result == L2CAP_CONF_SUCCESS) |
| 2417 | pi->conf_state |= L2CAP_CONF_OUTPUT_DONE; | 2422 | pi->conf_state |= L2CAP_CONF_OUTPUT_DONE; |
| 2418 | } | 2423 | } |
diff --git a/net/core/dev.c b/net/core/dev.c index b8f74cfb1bf..fe10551d367 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -942,14 +942,15 @@ rollback: | |||
| 942 | ret = notifier_to_errno(ret); | 942 | ret = notifier_to_errno(ret); |
| 943 | 943 | ||
| 944 | if (ret) { | 944 | if (ret) { |
| 945 | if (err) { | 945 | /* err >= 0 after dev_alloc_name() or stores the first errno */ |
| 946 | printk(KERN_ERR | 946 | if (err >= 0) { |
| 947 | "%s: name change rollback failed: %d.\n", | ||
| 948 | dev->name, ret); | ||
| 949 | } else { | ||
| 950 | err = ret; | 947 | err = ret; |
| 951 | memcpy(dev->name, oldname, IFNAMSIZ); | 948 | memcpy(dev->name, oldname, IFNAMSIZ); |
| 952 | goto rollback; | 949 | goto rollback; |
| 950 | } else { | ||
| 951 | printk(KERN_ERR | ||
| 952 | "%s: name change rollback failed: %d.\n", | ||
| 953 | dev->name, ret); | ||
| 953 | } | 954 | } |
| 954 | } | 955 | } |
| 955 | 956 | ||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 80a96166df3..ec85681a7dd 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -2701,7 +2701,8 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb) | |||
| 2701 | 2701 | ||
| 2702 | NAPI_GRO_CB(skb)->free = 1; | 2702 | NAPI_GRO_CB(skb)->free = 1; |
| 2703 | goto done; | 2703 | goto done; |
| 2704 | } | 2704 | } else if (skb_gro_len(p) != pinfo->gso_size) |
| 2705 | return -E2BIG; | ||
| 2705 | 2706 | ||
| 2706 | headroom = skb_headroom(p); | 2707 | headroom = skb_headroom(p); |
| 2707 | nskb = netdev_alloc_skb(p->dev, headroom + skb_gro_offset(p)); | 2708 | nskb = netdev_alloc_skb(p->dev, headroom + skb_gro_offset(p)); |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 630a56df7b4..99508d66a64 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -483,8 +483,10 @@ static int vif_add(struct net *net, struct vifctl *vifc, int mrtsock) | |||
| 483 | return -EINVAL; | 483 | return -EINVAL; |
| 484 | } | 484 | } |
| 485 | 485 | ||
| 486 | if ((in_dev = __in_dev_get_rtnl(dev)) == NULL) | 486 | if ((in_dev = __in_dev_get_rtnl(dev)) == NULL) { |
| 487 | dev_put(dev); | ||
| 487 | return -EADDRNOTAVAIL; | 488 | return -EADDRNOTAVAIL; |
| 489 | } | ||
| 488 | IPV4_DEVCONF(in_dev->cnf, MC_FORWARDING)++; | 490 | IPV4_DEVCONF(in_dev->cnf, MC_FORWARDING)++; |
| 489 | ip_rt_multicast_event(in_dev); | 491 | ip_rt_multicast_event(in_dev); |
| 490 | 492 | ||
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 98440ad8255..f1813bc7108 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -1183,7 +1183,9 @@ void tcp_cleanup_rbuf(struct sock *sk, int copied) | |||
| 1183 | #if TCP_DEBUG | 1183 | #if TCP_DEBUG |
| 1184 | struct sk_buff *skb = skb_peek(&sk->sk_receive_queue); | 1184 | struct sk_buff *skb = skb_peek(&sk->sk_receive_queue); |
| 1185 | 1185 | ||
| 1186 | WARN_ON(skb && !before(tp->copied_seq, TCP_SKB_CB(skb)->end_seq)); | 1186 | WARN(skb && !before(tp->copied_seq, TCP_SKB_CB(skb)->end_seq), |
| 1187 | KERN_INFO "cleanup rbuf bug: copied %X seq %X rcvnxt %X\n", | ||
| 1188 | tp->copied_seq, TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt); | ||
| 1187 | #endif | 1189 | #endif |
| 1188 | 1190 | ||
| 1189 | if (inet_csk_ack_scheduled(sk)) { | 1191 | if (inet_csk_ack_scheduled(sk)) { |
| @@ -1430,11 +1432,13 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 1430 | /* Now that we have two receive queues this | 1432 | /* Now that we have two receive queues this |
| 1431 | * shouldn't happen. | 1433 | * shouldn't happen. |
| 1432 | */ | 1434 | */ |
| 1433 | if (before(*seq, TCP_SKB_CB(skb)->seq)) { | 1435 | if (WARN(before(*seq, TCP_SKB_CB(skb)->seq), |
| 1434 | printk(KERN_INFO "recvmsg bug: copied %X " | 1436 | KERN_INFO "recvmsg bug: copied %X " |
| 1435 | "seq %X\n", *seq, TCP_SKB_CB(skb)->seq); | 1437 | "seq %X rcvnxt %X fl %X\n", *seq, |
| 1438 | TCP_SKB_CB(skb)->seq, tp->rcv_nxt, | ||
| 1439 | flags)) | ||
| 1436 | break; | 1440 | break; |
| 1437 | } | 1441 | |
| 1438 | offset = *seq - TCP_SKB_CB(skb)->seq; | 1442 | offset = *seq - TCP_SKB_CB(skb)->seq; |
| 1439 | if (tcp_hdr(skb)->syn) | 1443 | if (tcp_hdr(skb)->syn) |
| 1440 | offset--; | 1444 | offset--; |
| @@ -1443,8 +1447,9 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 1443 | if (tcp_hdr(skb)->fin) | 1447 | if (tcp_hdr(skb)->fin) |
| 1444 | goto found_fin_ok; | 1448 | goto found_fin_ok; |
| 1445 | WARN(!(flags & MSG_PEEK), KERN_INFO "recvmsg bug 2: " | 1449 | WARN(!(flags & MSG_PEEK), KERN_INFO "recvmsg bug 2: " |
| 1446 | "copied %X seq %X\n", *seq, | 1450 | "copied %X seq %X rcvnxt %X fl %X\n", |
| 1447 | TCP_SKB_CB(skb)->seq); | 1451 | *seq, TCP_SKB_CB(skb)->seq, |
| 1452 | tp->rcv_nxt, flags); | ||
| 1448 | } | 1453 | } |
| 1449 | 1454 | ||
| 1450 | /* Well, if we have backlog, try to process it now yet. */ | 1455 | /* Well, if we have backlog, try to process it now yet. */ |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 8450960df24..7eed77a39d0 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
| @@ -1485,15 +1485,13 @@ void sctp_assoc_rwnd_decrease(struct sctp_association *asoc, unsigned len) | |||
| 1485 | * local endpoint and the remote peer. | 1485 | * local endpoint and the remote peer. |
| 1486 | */ | 1486 | */ |
| 1487 | int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *asoc, | 1487 | int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *asoc, |
| 1488 | gfp_t gfp) | 1488 | sctp_scope_t scope, gfp_t gfp) |
| 1489 | { | 1489 | { |
| 1490 | sctp_scope_t scope; | ||
| 1491 | int flags; | 1490 | int flags; |
| 1492 | 1491 | ||
| 1493 | /* Use scoping rules to determine the subset of addresses from | 1492 | /* Use scoping rules to determine the subset of addresses from |
| 1494 | * the endpoint. | 1493 | * the endpoint. |
| 1495 | */ | 1494 | */ |
| 1496 | scope = sctp_scope(&asoc->peer.active_path->ipaddr); | ||
| 1497 | flags = (PF_INET6 == asoc->base.sk->sk_family) ? SCTP_ADDR6_ALLOWED : 0; | 1495 | flags = (PF_INET6 == asoc->base.sk->sk_family) ? SCTP_ADDR6_ALLOWED : 0; |
| 1498 | if (asoc->peer.ipv4_address) | 1496 | if (asoc->peer.ipv4_address) |
| 1499 | flags |= SCTP_ADDR4_PEERSUPP; | 1497 | flags |= SCTP_ADDR4_PEERSUPP; |
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index c8fae1983dd..d4df45022ff 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
| @@ -384,6 +384,11 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep, | |||
| 384 | if (!new_asoc) | 384 | if (!new_asoc) |
| 385 | goto nomem; | 385 | goto nomem; |
| 386 | 386 | ||
| 387 | if (sctp_assoc_set_bind_addr_from_ep(new_asoc, | ||
| 388 | sctp_scope(sctp_source(chunk)), | ||
| 389 | GFP_ATOMIC) < 0) | ||
| 390 | goto nomem_init; | ||
| 391 | |||
| 387 | /* The call, sctp_process_init(), can fail on memory allocation. */ | 392 | /* The call, sctp_process_init(), can fail on memory allocation. */ |
| 388 | if (!sctp_process_init(new_asoc, chunk->chunk_hdr->type, | 393 | if (!sctp_process_init(new_asoc, chunk->chunk_hdr->type, |
| 389 | sctp_source(chunk), | 394 | sctp_source(chunk), |
| @@ -401,9 +406,6 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep, | |||
| 401 | len = ntohs(err_chunk->chunk_hdr->length) - | 406 | len = ntohs(err_chunk->chunk_hdr->length) - |
| 402 | sizeof(sctp_chunkhdr_t); | 407 | sizeof(sctp_chunkhdr_t); |
| 403 | 408 | ||
| 404 | if (sctp_assoc_set_bind_addr_from_ep(new_asoc, GFP_ATOMIC) < 0) | ||
| 405 | goto nomem_init; | ||
| 406 | |||
| 407 | repl = sctp_make_init_ack(new_asoc, chunk, GFP_ATOMIC, len); | 409 | repl = sctp_make_init_ack(new_asoc, chunk, GFP_ATOMIC, len); |
| 408 | if (!repl) | 410 | if (!repl) |
| 409 | goto nomem_init; | 411 | goto nomem_init; |
| @@ -1452,6 +1454,10 @@ static sctp_disposition_t sctp_sf_do_unexpected_init( | |||
| 1452 | if (!new_asoc) | 1454 | if (!new_asoc) |
| 1453 | goto nomem; | 1455 | goto nomem; |
| 1454 | 1456 | ||
| 1457 | if (sctp_assoc_set_bind_addr_from_ep(new_asoc, | ||
| 1458 | sctp_scope(sctp_source(chunk)), GFP_ATOMIC) < 0) | ||
| 1459 | goto nomem; | ||
| 1460 | |||
| 1455 | /* In the outbound INIT ACK the endpoint MUST copy its current | 1461 | /* In the outbound INIT ACK the endpoint MUST copy its current |
| 1456 | * Verification Tag and Peers Verification tag into a reserved | 1462 | * Verification Tag and Peers Verification tag into a reserved |
| 1457 | * place (local tie-tag and per tie-tag) within the state cookie. | 1463 | * place (local tie-tag and per tie-tag) within the state cookie. |
| @@ -1488,9 +1494,6 @@ static sctp_disposition_t sctp_sf_do_unexpected_init( | |||
| 1488 | sizeof(sctp_chunkhdr_t); | 1494 | sizeof(sctp_chunkhdr_t); |
| 1489 | } | 1495 | } |
| 1490 | 1496 | ||
| 1491 | if (sctp_assoc_set_bind_addr_from_ep(new_asoc, GFP_ATOMIC) < 0) | ||
| 1492 | goto nomem; | ||
| 1493 | |||
| 1494 | repl = sctp_make_init_ack(new_asoc, chunk, GFP_ATOMIC, len); | 1497 | repl = sctp_make_init_ack(new_asoc, chunk, GFP_ATOMIC, len); |
| 1495 | if (!repl) | 1498 | if (!repl) |
| 1496 | goto nomem; | 1499 | goto nomem; |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index c8d05758661..3a95fcb17a9 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
| @@ -1080,6 +1080,13 @@ static int __sctp_connect(struct sock* sk, | |||
| 1080 | err = -ENOMEM; | 1080 | err = -ENOMEM; |
| 1081 | goto out_free; | 1081 | goto out_free; |
| 1082 | } | 1082 | } |
| 1083 | |||
| 1084 | err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, | ||
| 1085 | GFP_KERNEL); | ||
| 1086 | if (err < 0) { | ||
| 1087 | goto out_free; | ||
| 1088 | } | ||
| 1089 | |||
| 1083 | } | 1090 | } |
| 1084 | 1091 | ||
| 1085 | /* Prime the peer's transport structures. */ | 1092 | /* Prime the peer's transport structures. */ |
| @@ -1095,11 +1102,6 @@ static int __sctp_connect(struct sock* sk, | |||
| 1095 | walk_size += af->sockaddr_len; | 1102 | walk_size += af->sockaddr_len; |
| 1096 | } | 1103 | } |
| 1097 | 1104 | ||
| 1098 | err = sctp_assoc_set_bind_addr_from_ep(asoc, GFP_KERNEL); | ||
| 1099 | if (err < 0) { | ||
| 1100 | goto out_free; | ||
| 1101 | } | ||
| 1102 | |||
| 1103 | /* In case the user of sctp_connectx() wants an association | 1105 | /* In case the user of sctp_connectx() wants an association |
| 1104 | * id back, assign one now. | 1106 | * id back, assign one now. |
| 1105 | */ | 1107 | */ |
| @@ -1274,22 +1276,30 @@ SCTP_STATIC int sctp_setsockopt_connectx(struct sock* sk, | |||
| 1274 | } | 1276 | } |
| 1275 | 1277 | ||
| 1276 | /* | 1278 | /* |
| 1277 | * New (hopefully final) interface for the API. The option buffer is used | 1279 | * New (hopefully final) interface for the API. |
| 1278 | * both for the returned association id and the addresses. | 1280 | * We use the sctp_getaddrs_old structure so that use-space library |
| 1281 | * can avoid any unnecessary allocations. The only defferent part | ||
| 1282 | * is that we store the actual length of the address buffer into the | ||
| 1283 | * addrs_num structure member. That way we can re-use the existing | ||
| 1284 | * code. | ||
| 1279 | */ | 1285 | */ |
| 1280 | SCTP_STATIC int sctp_getsockopt_connectx3(struct sock* sk, int len, | 1286 | SCTP_STATIC int sctp_getsockopt_connectx3(struct sock* sk, int len, |
| 1281 | char __user *optval, | 1287 | char __user *optval, |
| 1282 | int __user *optlen) | 1288 | int __user *optlen) |
| 1283 | { | 1289 | { |
| 1290 | struct sctp_getaddrs_old param; | ||
| 1284 | sctp_assoc_t assoc_id = 0; | 1291 | sctp_assoc_t assoc_id = 0; |
| 1285 | int err = 0; | 1292 | int err = 0; |
| 1286 | 1293 | ||
| 1287 | if (len < sizeof(assoc_id)) | 1294 | if (len < sizeof(param)) |
| 1288 | return -EINVAL; | 1295 | return -EINVAL; |
| 1289 | 1296 | ||
| 1297 | if (copy_from_user(¶m, optval, sizeof(param))) | ||
| 1298 | return -EFAULT; | ||
| 1299 | |||
| 1290 | err = __sctp_setsockopt_connectx(sk, | 1300 | err = __sctp_setsockopt_connectx(sk, |
| 1291 | (struct sockaddr __user *)(optval + sizeof(assoc_id)), | 1301 | (struct sockaddr __user *)param.addrs, |
| 1292 | len - sizeof(assoc_id), &assoc_id); | 1302 | param.addr_num, &assoc_id); |
| 1293 | 1303 | ||
| 1294 | if (err == 0 || err == -EINPROGRESS) { | 1304 | if (err == 0 || err == -EINPROGRESS) { |
| 1295 | if (copy_to_user(optval, &assoc_id, sizeof(assoc_id))) | 1305 | if (copy_to_user(optval, &assoc_id, sizeof(assoc_id))) |
| @@ -1689,6 +1699,11 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 1689 | goto out_unlock; | 1699 | goto out_unlock; |
| 1690 | } | 1700 | } |
| 1691 | asoc = new_asoc; | 1701 | asoc = new_asoc; |
| 1702 | err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, GFP_KERNEL); | ||
| 1703 | if (err < 0) { | ||
| 1704 | err = -ENOMEM; | ||
| 1705 | goto out_free; | ||
| 1706 | } | ||
| 1692 | 1707 | ||
| 1693 | /* If the SCTP_INIT ancillary data is specified, set all | 1708 | /* If the SCTP_INIT ancillary data is specified, set all |
| 1694 | * the association init values accordingly. | 1709 | * the association init values accordingly. |
| @@ -1718,11 +1733,6 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 1718 | err = -ENOMEM; | 1733 | err = -ENOMEM; |
| 1719 | goto out_free; | 1734 | goto out_free; |
| 1720 | } | 1735 | } |
| 1721 | err = sctp_assoc_set_bind_addr_from_ep(asoc, GFP_KERNEL); | ||
| 1722 | if (err < 0) { | ||
| 1723 | err = -ENOMEM; | ||
| 1724 | goto out_free; | ||
| 1725 | } | ||
| 1726 | } | 1736 | } |
| 1727 | 1737 | ||
| 1728 | /* ASSERT: we have a valid association at this point. */ | 1738 | /* ASSERT: we have a valid association at this point. */ |
diff --git a/net/sctp/transport.c b/net/sctp/transport.c index c256e483931..3b141bb32fa 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c | |||
| @@ -308,7 +308,8 @@ void sctp_transport_route(struct sctp_transport *transport, | |||
| 308 | /* Initialize sk->sk_rcv_saddr, if the transport is the | 308 | /* Initialize sk->sk_rcv_saddr, if the transport is the |
| 309 | * association's active path for getsockname(). | 309 | * association's active path for getsockname(). |
| 310 | */ | 310 | */ |
| 311 | if (asoc && (transport == asoc->peer.active_path)) | 311 | if (asoc && (!asoc->peer.primary_path || |
| 312 | (transport == asoc->peer.active_path))) | ||
| 312 | opt->pf->af->to_sk_saddr(&transport->saddr, | 313 | opt->pf->af->to_sk_saddr(&transport->saddr, |
| 313 | asoc->base.sk); | 314 | asoc->base.sk); |
| 314 | } else | 315 | } else |
