diff options
| -rw-r--r-- | include/net/sctp/structs.h | 4 | ||||
| -rw-r--r-- | net/sctp/auth.c | 17 | ||||
| -rw-r--r-- | net/sctp/endpointola.c | 3 | ||||
| -rw-r--r-- | net/sctp/sm_make_chunk.c | 32 | ||||
| -rw-r--r-- | net/sctp/sm_statefuns.c | 6 | ||||
| -rw-r--r-- | net/sctp/socket.c | 54 | ||||
| -rw-r--r-- | net/sctp/sysctl.c | 36 |
7 files changed, 92 insertions, 60 deletions
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index d992ca3145fe..0dfcc92600e8 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
| @@ -1241,6 +1241,7 @@ struct sctp_endpoint { | |||
| 1241 | /* SCTP-AUTH: endpoint shared keys */ | 1241 | /* SCTP-AUTH: endpoint shared keys */ |
| 1242 | struct list_head endpoint_shared_keys; | 1242 | struct list_head endpoint_shared_keys; |
| 1243 | __u16 active_key_id; | 1243 | __u16 active_key_id; |
| 1244 | __u8 auth_enable; | ||
| 1244 | }; | 1245 | }; |
| 1245 | 1246 | ||
| 1246 | /* Recover the outter endpoint structure. */ | 1247 | /* Recover the outter endpoint structure. */ |
| @@ -1269,7 +1270,8 @@ struct sctp_endpoint *sctp_endpoint_is_match(struct sctp_endpoint *, | |||
| 1269 | int sctp_has_association(struct net *net, const union sctp_addr *laddr, | 1270 | int sctp_has_association(struct net *net, const union sctp_addr *laddr, |
| 1270 | const union sctp_addr *paddr); | 1271 | const union sctp_addr *paddr); |
| 1271 | 1272 | ||
| 1272 | int sctp_verify_init(struct net *net, const struct sctp_association *asoc, | 1273 | int sctp_verify_init(struct net *net, const struct sctp_endpoint *ep, |
| 1274 | const struct sctp_association *asoc, | ||
| 1273 | sctp_cid_t, sctp_init_chunk_t *peer_init, | 1275 | sctp_cid_t, sctp_init_chunk_t *peer_init, |
| 1274 | struct sctp_chunk *chunk, struct sctp_chunk **err_chunk); | 1276 | struct sctp_chunk *chunk, struct sctp_chunk **err_chunk); |
| 1275 | int sctp_process_init(struct sctp_association *, struct sctp_chunk *chunk, | 1277 | int sctp_process_init(struct sctp_association *, struct sctp_chunk *chunk, |
diff --git a/net/sctp/auth.c b/net/sctp/auth.c index 683c7d1b1306..0e8529113dc5 100644 --- a/net/sctp/auth.c +++ b/net/sctp/auth.c | |||
| @@ -386,14 +386,13 @@ nomem: | |||
| 386 | */ | 386 | */ |
| 387 | int sctp_auth_asoc_init_active_key(struct sctp_association *asoc, gfp_t gfp) | 387 | int sctp_auth_asoc_init_active_key(struct sctp_association *asoc, gfp_t gfp) |
| 388 | { | 388 | { |
| 389 | struct net *net = sock_net(asoc->base.sk); | ||
| 390 | struct sctp_auth_bytes *secret; | 389 | struct sctp_auth_bytes *secret; |
| 391 | struct sctp_shared_key *ep_key; | 390 | struct sctp_shared_key *ep_key; |
| 392 | 391 | ||
| 393 | /* If we don't support AUTH, or peer is not capable | 392 | /* If we don't support AUTH, or peer is not capable |
| 394 | * we don't need to do anything. | 393 | * we don't need to do anything. |
| 395 | */ | 394 | */ |
| 396 | if (!net->sctp.auth_enable || !asoc->peer.auth_capable) | 395 | if (!asoc->ep->auth_enable || !asoc->peer.auth_capable) |
| 397 | return 0; | 396 | return 0; |
| 398 | 397 | ||
| 399 | /* If the key_id is non-zero and we couldn't find an | 398 | /* If the key_id is non-zero and we couldn't find an |
| @@ -440,16 +439,16 @@ struct sctp_shared_key *sctp_auth_get_shkey( | |||
| 440 | */ | 439 | */ |
| 441 | int sctp_auth_init_hmacs(struct sctp_endpoint *ep, gfp_t gfp) | 440 | int sctp_auth_init_hmacs(struct sctp_endpoint *ep, gfp_t gfp) |
| 442 | { | 441 | { |
| 443 | struct net *net = sock_net(ep->base.sk); | ||
| 444 | struct crypto_hash *tfm = NULL; | 442 | struct crypto_hash *tfm = NULL; |
| 445 | __u16 id; | 443 | __u16 id; |
| 446 | 444 | ||
| 447 | /* if the transforms are already allocted, we are done */ | 445 | /* If AUTH extension is disabled, we are done */ |
| 448 | if (!net->sctp.auth_enable) { | 446 | if (!ep->auth_enable) { |
| 449 | ep->auth_hmacs = NULL; | 447 | ep->auth_hmacs = NULL; |
| 450 | return 0; | 448 | return 0; |
| 451 | } | 449 | } |
| 452 | 450 | ||
| 451 | /* If the transforms are already allocated, we are done */ | ||
| 453 | if (ep->auth_hmacs) | 452 | if (ep->auth_hmacs) |
| 454 | return 0; | 453 | return 0; |
| 455 | 454 | ||
| @@ -665,12 +664,10 @@ static int __sctp_auth_cid(sctp_cid_t chunk, struct sctp_chunks_param *param) | |||
| 665 | /* Check if peer requested that this chunk is authenticated */ | 664 | /* Check if peer requested that this chunk is authenticated */ |
| 666 | int sctp_auth_send_cid(sctp_cid_t chunk, const struct sctp_association *asoc) | 665 | int sctp_auth_send_cid(sctp_cid_t chunk, const struct sctp_association *asoc) |
| 667 | { | 666 | { |
| 668 | struct net *net; | ||
| 669 | if (!asoc) | 667 | if (!asoc) |
| 670 | return 0; | 668 | return 0; |
| 671 | 669 | ||
| 672 | net = sock_net(asoc->base.sk); | 670 | if (!asoc->ep->auth_enable || !asoc->peer.auth_capable) |
| 673 | if (!net->sctp.auth_enable || !asoc->peer.auth_capable) | ||
| 674 | return 0; | 671 | return 0; |
| 675 | 672 | ||
| 676 | return __sctp_auth_cid(chunk, asoc->peer.peer_chunks); | 673 | return __sctp_auth_cid(chunk, asoc->peer.peer_chunks); |
| @@ -679,12 +676,10 @@ int sctp_auth_send_cid(sctp_cid_t chunk, const struct sctp_association *asoc) | |||
| 679 | /* Check if we requested that peer authenticate this chunk. */ | 676 | /* Check if we requested that peer authenticate this chunk. */ |
| 680 | int sctp_auth_recv_cid(sctp_cid_t chunk, const struct sctp_association *asoc) | 677 | int sctp_auth_recv_cid(sctp_cid_t chunk, const struct sctp_association *asoc) |
| 681 | { | 678 | { |
| 682 | struct net *net; | ||
| 683 | if (!asoc) | 679 | if (!asoc) |
| 684 | return 0; | 680 | return 0; |
| 685 | 681 | ||
| 686 | net = sock_net(asoc->base.sk); | 682 | if (!asoc->ep->auth_enable) |
| 687 | if (!net->sctp.auth_enable) | ||
| 688 | return 0; | 683 | return 0; |
| 689 | 684 | ||
| 690 | return __sctp_auth_cid(chunk, | 685 | return __sctp_auth_cid(chunk, |
diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c index 8e5fdea05216..3d9f429858dc 100644 --- a/net/sctp/endpointola.c +++ b/net/sctp/endpointola.c | |||
| @@ -68,7 +68,8 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, | |||
| 68 | if (!ep->digest) | 68 | if (!ep->digest) |
| 69 | return NULL; | 69 | return NULL; |
| 70 | 70 | ||
| 71 | if (net->sctp.auth_enable) { | 71 | ep->auth_enable = net->sctp.auth_enable; |
| 72 | if (ep->auth_enable) { | ||
| 72 | /* Allocate space for HMACS and CHUNKS authentication | 73 | /* Allocate space for HMACS and CHUNKS authentication |
| 73 | * variables. There are arrays that we encode directly | 74 | * variables. There are arrays that we encode directly |
| 74 | * into parameters to make the rest of the operations easier. | 75 | * into parameters to make the rest of the operations easier. |
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index 3a1767ef3201..fee5552ddf92 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
| @@ -219,6 +219,7 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, | |||
| 219 | gfp_t gfp, int vparam_len) | 219 | gfp_t gfp, int vparam_len) |
| 220 | { | 220 | { |
| 221 | struct net *net = sock_net(asoc->base.sk); | 221 | struct net *net = sock_net(asoc->base.sk); |
| 222 | struct sctp_endpoint *ep = asoc->ep; | ||
| 222 | sctp_inithdr_t init; | 223 | sctp_inithdr_t init; |
| 223 | union sctp_params addrs; | 224 | union sctp_params addrs; |
| 224 | size_t chunksize; | 225 | size_t chunksize; |
| @@ -278,7 +279,7 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, | |||
| 278 | chunksize += vparam_len; | 279 | chunksize += vparam_len; |
| 279 | 280 | ||
| 280 | /* Account for AUTH related parameters */ | 281 | /* Account for AUTH related parameters */ |
| 281 | if (net->sctp.auth_enable) { | 282 | if (ep->auth_enable) { |
| 282 | /* Add random parameter length*/ | 283 | /* Add random parameter length*/ |
| 283 | chunksize += sizeof(asoc->c.auth_random); | 284 | chunksize += sizeof(asoc->c.auth_random); |
| 284 | 285 | ||
| @@ -363,7 +364,7 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, | |||
| 363 | } | 364 | } |
| 364 | 365 | ||
| 365 | /* Add SCTP-AUTH chunks to the parameter list */ | 366 | /* Add SCTP-AUTH chunks to the parameter list */ |
| 366 | if (net->sctp.auth_enable) { | 367 | if (ep->auth_enable) { |
| 367 | sctp_addto_chunk(retval, sizeof(asoc->c.auth_random), | 368 | sctp_addto_chunk(retval, sizeof(asoc->c.auth_random), |
| 368 | asoc->c.auth_random); | 369 | asoc->c.auth_random); |
| 369 | if (auth_hmacs) | 370 | if (auth_hmacs) |
| @@ -2010,7 +2011,7 @@ static void sctp_process_ext_param(struct sctp_association *asoc, | |||
| 2010 | /* if the peer reports AUTH, assume that he | 2011 | /* if the peer reports AUTH, assume that he |
| 2011 | * supports AUTH. | 2012 | * supports AUTH. |
| 2012 | */ | 2013 | */ |
| 2013 | if (net->sctp.auth_enable) | 2014 | if (asoc->ep->auth_enable) |
| 2014 | asoc->peer.auth_capable = 1; | 2015 | asoc->peer.auth_capable = 1; |
| 2015 | break; | 2016 | break; |
| 2016 | case SCTP_CID_ASCONF: | 2017 | case SCTP_CID_ASCONF: |
| @@ -2102,6 +2103,7 @@ static sctp_ierror_t sctp_process_unk_param(const struct sctp_association *asoc, | |||
| 2102 | * SCTP_IERROR_NO_ERROR - continue with the chunk | 2103 | * SCTP_IERROR_NO_ERROR - continue with the chunk |
| 2103 | */ | 2104 | */ |
| 2104 | static sctp_ierror_t sctp_verify_param(struct net *net, | 2105 | static sctp_ierror_t sctp_verify_param(struct net *net, |
| 2106 | const struct sctp_endpoint *ep, | ||
| 2105 | const struct sctp_association *asoc, | 2107 | const struct sctp_association *asoc, |
| 2106 | union sctp_params param, | 2108 | union sctp_params param, |
| 2107 | sctp_cid_t cid, | 2109 | sctp_cid_t cid, |
| @@ -2152,7 +2154,7 @@ static sctp_ierror_t sctp_verify_param(struct net *net, | |||
| 2152 | goto fallthrough; | 2154 | goto fallthrough; |
| 2153 | 2155 | ||
| 2154 | case SCTP_PARAM_RANDOM: | 2156 | case SCTP_PARAM_RANDOM: |
| 2155 | if (!net->sctp.auth_enable) | 2157 | if (!ep->auth_enable) |
| 2 | |||
