[SUNRPC]: Make sure on-stack cmsg buffer is properly aligned.

Based upon a report from Meelis Roos.

Signed-off-by: David S. Miller <davem@davemloft.net>

+12 -4
+12 -4
net/sunrpc/svcsock.c
··· 452 452 struct in_pktinfo pkti; 453 453 struct in6_pktinfo pkti6; 454 454 }; 455 + #define SVC_PKTINFO_SPACE \ 456 + CMSG_SPACE(sizeof(union svc_pktinfo_u)) 455 457 456 458 static void svc_set_cmsg_data(struct svc_rqst *rqstp, struct cmsghdr *cmh) 457 459 { ··· 493 491 struct svc_sock *svsk = rqstp->rq_sock; 494 492 struct socket *sock = svsk->sk_sock; 495 493 int slen; 496 - char buffer[CMSG_SPACE(sizeof(union svc_pktinfo_u))]; 497 - struct cmsghdr *cmh = (struct cmsghdr *)buffer; 494 + union { 495 + struct cmsghdr hdr; 496 + long all[SVC_PKTINFO_SPACE / sizeof(long)]; 497 + } buffer; 498 + struct cmsghdr *cmh = &buffer.hdr; 498 499 int len = 0; 499 500 int result; 500 501 int size; ··· 750 745 struct svc_sock *svsk = rqstp->rq_sock; 751 746 struct svc_serv *serv = svsk->sk_server; 752 747 struct sk_buff *skb; 753 - char buffer[CMSG_SPACE(sizeof(union svc_pktinfo_u))]; 754 - struct cmsghdr *cmh = (struct cmsghdr *)buffer; 748 + union { 749 + struct cmsghdr hdr; 750 + long all[SVC_PKTINFO_SPACE / sizeof(long)]; 751 + } buffer; 752 + struct cmsghdr *cmh = &buffer.hdr; 755 753 int err, len; 756 754 struct msghdr msg = { 757 755 .msg_name = svc_addr(rqstp),