diff options
| -rw-r--r-- | include/net/sctp/structs.h | 3 | ||||
| -rw-r--r-- | net/sctp/sm_make_chunk.c | 14 |
2 files changed, 14 insertions, 3 deletions
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index f5c22d77feab..72aeae4a0067 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
| @@ -405,8 +405,9 @@ struct sctp_cookie { | |||
| 405 | /* The format of our cookie that we send to our peer. */ | 405 | /* The format of our cookie that we send to our peer. */ |
| 406 | struct sctp_signed_cookie { | 406 | struct sctp_signed_cookie { |
| 407 | __u8 signature[SCTP_SECRET_SIZE]; | 407 | __u8 signature[SCTP_SECRET_SIZE]; |
| 408 | __u32 __pad; /* force sctp_cookie alignment to 64 bits */ | ||
| 408 | struct sctp_cookie c; | 409 | struct sctp_cookie c; |
| 409 | }; | 410 | } __attribute__((packed)); |
| 410 | 411 | ||
| 411 | /* This is another convenience type to allocate memory for address | 412 | /* This is another convenience type to allocate memory for address |
| 412 | * params for the maximum size and pass such structures around | 413 | * params for the maximum size and pass such structures around |
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index 556c495c6922..4fe1d6c863b1 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
| @@ -1275,7 +1275,12 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep, | |||
| 1275 | unsigned int keylen; | 1275 | unsigned int keylen; |
| 1276 | char *key; | 1276 | char *key; |
| 1277 | 1277 | ||
| 1278 | headersize = sizeof(sctp_paramhdr_t) + SCTP_SECRET_SIZE; | 1278 | /* Header size is static data prior to the actual cookie, including |
| 1279 | * any padding. | ||
| 1280 | */ | ||
| 1281 | headersize = sizeof(sctp_paramhdr_t) + | ||
| 1282 | (sizeof(struct sctp_signed_cookie) - | ||
| 1283 | sizeof(struct sctp_cookie)); | ||
| 1279 | bodysize = sizeof(struct sctp_cookie) | 1284 | bodysize = sizeof(struct sctp_cookie) |
| 1280 | + ntohs(init_chunk->chunk_hdr->length) + addrs_len; | 1285 | + ntohs(init_chunk->chunk_hdr->length) + addrs_len; |
| 1281 | 1286 | ||
| @@ -1362,7 +1367,12 @@ struct sctp_association *sctp_unpack_cookie( | |||
| 1362 | struct sk_buff *skb = chunk->skb; | 1367 | struct sk_buff *skb = chunk->skb; |
| 1363 | struct timeval tv; | 1368 | struct timeval tv; |
| 1364 | 1369 | ||
| 1365 | headersize = sizeof(sctp_chunkhdr_t) + SCTP_SECRET_SIZE; | 1370 | /* Header size is static data prior to the actual cookie, including |
| 1371 | * any padding. | ||
| 1372 | */ | ||
| 1373 | headersize = sizeof(sctp_chunkhdr_t) + | ||
| 1374 | (sizeof(struct sctp_signed_cookie) - | ||
| 1375 | sizeof(struct sctp_cookie)); | ||
| 1366 | bodysize = ntohs(chunk->chunk_hdr->length) - headersize; | 1376 | bodysize = ntohs(chunk->chunk_hdr->length) - headersize; |
| 1367 | fixed_size = headersize + sizeof(struct sctp_cookie); | 1377 | fixed_size = headersize + sizeof(struct sctp_cookie); |
| 1368 | 1378 | ||
