Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bc375ea7 authored by David S. Miller's avatar David S. Miller
Browse files

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



Based upon a report from Meelis Roos.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1d51c69f
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -452,6 +452,8 @@ union svc_pktinfo_u {
	struct in_pktinfo pkti;
	struct in6_pktinfo pkti6;
};
#define SVC_PKTINFO_SPACE \
	CMSG_SPACE(sizeof(union svc_pktinfo_u))

static void svc_set_cmsg_data(struct svc_rqst *rqstp, struct cmsghdr *cmh)
{
@@ -491,8 +493,11 @@ svc_sendto(struct svc_rqst *rqstp, struct xdr_buf *xdr)
	struct svc_sock	*svsk = rqstp->rq_sock;
	struct socket	*sock = svsk->sk_sock;
	int		slen;
	char 		buffer[CMSG_SPACE(sizeof(union svc_pktinfo_u))];
	struct cmsghdr *cmh = (struct cmsghdr *)buffer;
	union {
		struct cmsghdr	hdr;
		long		all[SVC_PKTINFO_SPACE / sizeof(long)];
	} buffer;
	struct cmsghdr *cmh = &buffer.hdr;
	int		len = 0;
	int		result;
	int		size;
@@ -745,8 +750,11 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
	struct svc_sock	*svsk = rqstp->rq_sock;
	struct svc_serv	*serv = svsk->sk_server;
	struct sk_buff	*skb;
	char		buffer[CMSG_SPACE(sizeof(union svc_pktinfo_u))];
	struct cmsghdr *cmh = (struct cmsghdr *)buffer;
	union {
		struct cmsghdr	hdr;
		long		all[SVC_PKTINFO_SPACE / sizeof(long)];
	} buffer;
	struct cmsghdr *cmh = &buffer.hdr;
	int		err, len;
	struct msghdr msg = {
		.msg_name = svc_addr(rqstp),