diff options
Diffstat (limited to 'net/sctp/socket.c')
| -rw-r--r-- | net/sctp/socket.c | 40 | 
1 files changed, 25 insertions, 15 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index c8d05758661d..3a95fcb17a9e 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. */ | 
