[SCTP]: Fix sctp_cookie alignment in the packet.
On 64 bit architectures, sctp_cookie sent as part of INIT-ACK is not aligned on a 64 bit boundry and thus causes unaligned access exceptions. The layout of the cookie prameter is this: |<----- Parameter Header --------------------|<--- Cookie DATA -------- ----------------------------------------------------------------------- | param type (16 bits) | param len (16 bits) | sig [32 bytes] | cookie.. ----------------------------------------------------------------------- The cookie data portion contains 64 bit values on 64 bit architechtures (timeval) that fall on a 32 bit alignment boundry when used as part of the on-wire format, but align correctly when used in internal structures. This patch explicitely pads the on-wire format so that it is properly aligned. Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com> Signed-off-by: Sridhar Samudrala <sri@us.ibm.com>
This commit is contained in:
Родитель
7a48f923b8
Коммит
9834a2bb49
|
@ -405,8 +405,9 @@ struct sctp_cookie {
|
|||
/* The format of our cookie that we send to our peer. */
|
||||
struct sctp_signed_cookie {
|
||||
__u8 signature[SCTP_SECRET_SIZE];
|
||||
__u32 __pad; /* force sctp_cookie alignment to 64 bits */
|
||||
struct sctp_cookie c;
|
||||
};
|
||||
} __attribute__((packed));
|
||||
|
||||
/* This is another convenience type to allocate memory for address
|
||||
* params for the maximum size and pass such structures around
|
||||
|
|
|
@ -1275,7 +1275,12 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep,
|
|||
unsigned int keylen;
|
||||
char *key;
|
||||
|
||||
headersize = sizeof(sctp_paramhdr_t) + SCTP_SECRET_SIZE;
|
||||
/* Header size is static data prior to the actual cookie, including
|
||||
* any padding.
|
||||
*/
|
||||
headersize = sizeof(sctp_paramhdr_t) +
|
||||
(sizeof(struct sctp_signed_cookie) -
|
||||
sizeof(struct sctp_cookie));
|
||||
bodysize = sizeof(struct sctp_cookie)
|
||||
+ ntohs(init_chunk->chunk_hdr->length) + addrs_len;
|
||||
|
||||
|
@ -1362,7 +1367,12 @@ struct sctp_association *sctp_unpack_cookie(
|
|||
struct sk_buff *skb = chunk->skb;
|
||||
struct timeval tv;
|
||||
|
||||
headersize = sizeof(sctp_chunkhdr_t) + SCTP_SECRET_SIZE;
|
||||
/* Header size is static data prior to the actual cookie, including
|
||||
* any padding.
|
||||
*/
|
||||
headersize = sizeof(sctp_chunkhdr_t) +
|
||||
(sizeof(struct sctp_signed_cookie) -
|
||||
sizeof(struct sctp_cookie));
|
||||
bodysize = ntohs(chunk->chunk_hdr->length) - headersize;
|
||||
fixed_size = headersize + sizeof(struct sctp_cookie);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче