forked from mirrors/linux
		
	[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:
		
							parent
							
								
									7a48f923b8
								
							
						
					
					
						commit
						9834a2bb49
					
				
					 2 changed files with 14 additions and 3 deletions
				
			
		|  | @ -405,8 +405,9 @@ struct sctp_cookie { | ||||||
| /* The format of our cookie that we send to our peer. */ | /* The format of our cookie that we send to our peer. */ | ||||||
| struct sctp_signed_cookie { | struct sctp_signed_cookie { | ||||||
| 	__u8 signature[SCTP_SECRET_SIZE]; | 	__u8 signature[SCTP_SECRET_SIZE]; | ||||||
|  | 	__u32 __pad;		/* force sctp_cookie alignment to 64 bits */ | ||||||
| 	struct sctp_cookie c; | 	struct sctp_cookie c; | ||||||
| }; | } __attribute__((packed)); | ||||||
| 
 | 
 | ||||||
| /* This is another convenience type to allocate memory for address
 | /* This is another convenience type to allocate memory for address
 | ||||||
|  * params for the maximum size and pass such structures around |  * 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; | 	unsigned int keylen; | ||||||
| 	char *key; | 	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) | 	bodysize = sizeof(struct sctp_cookie) | ||||||
| 		+ ntohs(init_chunk->chunk_hdr->length) + addrs_len; | 		+ 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 sk_buff *skb = chunk->skb; | ||||||
| 	struct timeval tv; | 	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; | 	bodysize = ntohs(chunk->chunk_hdr->length) - headersize; | ||||||
| 	fixed_size = headersize + sizeof(struct sctp_cookie); | 	fixed_size = headersize + sizeof(struct sctp_cookie); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Vlad Yasevich
						Vlad Yasevich