diff options
| author | David S. Miller <davem@sunset.davemloft.net> | 2007-04-12 16:35:59 -0400 |
|---|---|---|
| committer | David S. Miller <davem@sunset.davemloft.net> | 2007-04-12 16:35:59 -0400 |
| commit | bc375ea7efcda0450b7cba9b3514e76d2e1cea79 (patch) | |
| tree | 321c7a881214991758b66d6877cae4cd0d2071c2 | |
| parent | 1d51c69fb6e61054cd6cc485f9bef77d19d82751 (diff) | |
[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>
| -rw-r--r-- | net/sunrpc/svcsock.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 593f62ff8521..2772fee93881 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
| @@ -452,6 +452,8 @@ union svc_pktinfo_u { | |||
| 452 | struct in_pktinfo pkti; | 452 | struct in_pktinfo pkti; |
| 453 | struct in6_pktinfo pkti6; | 453 | struct in6_pktinfo pkti6; |
| 454 | }; | 454 | }; |
| 455 | #define SVC_PKTINFO_SPACE \ | ||
| 456 | CMSG_SPACE(sizeof(union svc_pktinfo_u)) | ||
| 455 | 457 | ||
| 456 | static void svc_set_cmsg_data(struct svc_rqst *rqstp, struct cmsghdr *cmh) | 458 | static void svc_set_cmsg_data(struct svc_rqst *rqstp, struct cmsghdr *cmh) |
| 457 | { | 459 | { |
| @@ -491,8 +493,11 @@ svc_sendto(struct svc_rqst *rqstp, struct xdr_buf *xdr) | |||
| 491 | struct svc_sock *svsk = rqstp->rq_sock; | 493 | struct svc_sock *svsk = rqstp->rq_sock; |
| 492 | struct socket *sock = svsk->sk_sock; | 494 | struct socket *sock = svsk->sk_sock; |
| 493 | int slen; | 495 | int slen; |
| 494 | char buffer[CMSG_SPACE(sizeof(union svc_pktinfo_u))]; | 496 | union { |
| 495 | struct cmsghdr *cmh = (struct cmsghdr *)buffer; | 497 | struct cmsghdr hdr; |
| 498 | long all[SVC_PKTINFO_SPACE / sizeof(long)]; | ||
| 499 | } buffer; | ||
| 500 | struct cmsghdr *cmh = &buffer.hdr; | ||
| 496 | int len = 0; | 501 | int len = 0; |
| 497 | int result; | 502 | int result; |
| 498 | int size; | 503 | int size; |
| @@ -745,8 +750,11 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
| 745 | struct svc_sock *svsk = rqstp->rq_sock; | 750 | struct svc_sock *svsk = rqstp->rq_sock; |
| 746 | struct svc_serv *serv = svsk->sk_server; | 751 | struct svc_serv *serv = svsk->sk_server; |
| 747 | struct sk_buff *skb; | 752 | struct sk_buff *skb; |
| 748 | char buffer[CMSG_SPACE(sizeof(union svc_pktinfo_u))]; | 753 | union { |
| 749 | struct cmsghdr *cmh = (struct cmsghdr *)buffer; | 754 | struct cmsghdr hdr; |
| 755 | long all[SVC_PKTINFO_SPACE / sizeof(long)]; | ||
| 756 | } buffer; | ||
| 757 | struct cmsghdr *cmh = &buffer.hdr; | ||
| 750 | int err, len; | 758 | int err, len; |
| 751 | struct msghdr msg = { | 759 | struct msghdr msg = { |
| 752 | .msg_name = svc_addr(rqstp), | 760 | .msg_name = svc_addr(rqstp), |
