diff options
Diffstat (limited to 'net/sctp/socket.c')
| -rw-r--r-- | net/sctp/socket.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index e34ca9cc1167..8e02550ff3e8 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
| @@ -111,12 +111,12 @@ static void sctp_sock_migrate(struct sock *, struct sock *, | |||
| 111 | static char *sctp_hmac_alg = SCTP_COOKIE_HMAC_ALG; | 111 | static char *sctp_hmac_alg = SCTP_COOKIE_HMAC_ALG; |
| 112 | 112 | ||
| 113 | extern struct kmem_cache *sctp_bucket_cachep; | 113 | extern struct kmem_cache *sctp_bucket_cachep; |
| 114 | extern int sysctl_sctp_mem[3]; | 114 | extern long sysctl_sctp_mem[3]; |
| 115 | extern int sysctl_sctp_rmem[3]; | 115 | extern int sysctl_sctp_rmem[3]; |
| 116 | extern int sysctl_sctp_wmem[3]; | 116 | extern int sysctl_sctp_wmem[3]; |
| 117 | 117 | ||
| 118 | static int sctp_memory_pressure; | 118 | static int sctp_memory_pressure; |
| 119 | static atomic_t sctp_memory_allocated; | 119 | static atomic_long_t sctp_memory_allocated; |
| 120 | struct percpu_counter sctp_sockets_allocated; | 120 | struct percpu_counter sctp_sockets_allocated; |
| 121 | 121 | ||
| 122 | static void sctp_enter_memory_pressure(struct sock *sk) | 122 | static void sctp_enter_memory_pressure(struct sock *sk) |
| @@ -2932,6 +2932,7 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optva | |||
| 2932 | struct sctp_association *asoc = NULL; | 2932 | struct sctp_association *asoc = NULL; |
| 2933 | struct sctp_setpeerprim prim; | 2933 | struct sctp_setpeerprim prim; |
| 2934 | struct sctp_chunk *chunk; | 2934 | struct sctp_chunk *chunk; |
| 2935 | struct sctp_af *af; | ||
| 2935 | int err; | 2936 | int err; |
| 2936 | 2937 | ||
| 2937 | sp = sctp_sk(sk); | 2938 | sp = sctp_sk(sk); |
| @@ -2959,6 +2960,13 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optva | |||
| 2959 | if (!sctp_state(asoc, ESTABLISHED)) | 2960 | if (!sctp_state(asoc, ESTABLISHED)) |
| 2960 | return -ENOTCONN; | 2961 | return -ENOTCONN; |
| 2961 | 2962 | ||
| 2963 | af = sctp_get_af_specific(prim.sspp_addr.ss_family); | ||
| 2964 | if (!af) | ||
| 2965 | return -EINVAL; | ||
| 2966 | |||
| 2967 | if (!af->addr_valid((union sctp_addr *)&prim.sspp_addr, sp, NULL)) | ||
| 2968 | return -EADDRNOTAVAIL; | ||
| 2969 | |||
| 2962 | if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr)) | 2970 | if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr)) |
| 2963 | return -EADDRNOTAVAIL; | 2971 | return -EADDRNOTAVAIL; |
| 2964 | 2972 | ||
| @@ -3420,7 +3428,7 @@ SCTP_STATIC int sctp_setsockopt(struct sock *sk, int level, int optname, | |||
| 3420 | retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen); | 3428 | retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen); |
| 3421 | break; | 3429 | break; |
| 3422 | 3430 | ||
| 3423 | case SCTP_DELAYED_ACK: | 3431 | case SCTP_DELAYED_SACK: |
| 3424 | retval = sctp_setsockopt_delayed_ack(sk, optval, optlen); | 3432 | retval = sctp_setsockopt_delayed_ack(sk, optval, optlen); |
| 3425 | break; | 3433 | break; |
| 3426 | case SCTP_PARTIAL_DELIVERY_POINT: | 3434 | case SCTP_PARTIAL_DELIVERY_POINT: |
| @@ -5045,7 +5053,7 @@ static int sctp_getsockopt_partial_delivery_point(struct sock *sk, int len, | |||
| 5045 | if (copy_to_user(optval, &val, len)) | 5053 | if (copy_to_user(optval, &val, len)) |
| 5046 | return -EFAULT; | 5054 | return -EFAULT; |
| 5047 | 5055 | ||
| 5048 | return -ENOTSUPP; | 5056 | return 0; |
| 5049 | } | 5057 | } |
| 5050 | 5058 | ||
| 5051 | /* | 5059 | /* |
| @@ -5325,7 +5333,7 @@ SCTP_STATIC int sctp_getsockopt(struct sock *sk, int level, int optname, | |||
| 5325 | retval = sctp_getsockopt_peer_addr_params(sk, len, optval, | 5333 | retval = sctp_getsockopt_peer_addr_params(sk, len, optval, |
| 5326 | optlen); | 5334 | optlen); |
| 5327 | break; | 5335 | break; |
| 5328 | case SCTP_DELAYED_ACK: | 5336 | case SCTP_DELAYED_SACK: |
| 5329 | retval = sctp_getsockopt_delayed_ack(sk, len, optval, | 5337 | retval = sctp_getsockopt_delayed_ack(sk, len, optval, |
| 5330 | optlen); | 5338 | optlen); |
| 5331 | break; | 5339 | break; |
| @@ -6047,7 +6055,7 @@ static struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags, | |||
| 6047 | * will suddenly eat the receive_queue. | 6055 | * will suddenly eat the receive_queue. |
| 6048 | * | 6056 | * |
| 6049 | * Look at current nfs client by the way... | 6057 | * Look at current nfs client by the way... |
| 6050 | * However, this function was corrent in any case. 8) | 6058 | * However, this function was correct in any case. 8) |
| 6051 | */ | 6059 | */ |
| 6052 | if (flags & MSG_PEEK) { | 6060 | if (flags & MSG_PEEK) { |
| 6053 | spin_lock_bh(&sk->sk_receive_queue.lock); | 6061 | spin_lock_bh(&sk->sk_receive_queue.lock); |
