[PATCH] knfsd: SUNRPC: Provide room in svc_rqst for larger addresses
Expand the rq_addr field to allow it to contain larger addresses. Specifically, we replace a 'sockaddr_in' with a 'sockaddr_storage', then everywhere the 'sockaddr_in' was referenced, we use instead an accessor function (svc_addr_in) which safely casts the _storage to _in. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Cc: Aurelien Charbon <aurelien.charbon@ext.bull.net> Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
2442222283
commit
27459f0940
@@ -153,7 +153,7 @@ static char *__svc_print_addr(struct sockaddr *addr, char *buf, size_t len)
|
||||
*/
|
||||
char *svc_print_addr(struct svc_rqst *rqstp, char *buf, size_t len)
|
||||
{
|
||||
return __svc_print_addr((struct sockaddr *) &rqstp->rq_addr, buf, len);
|
||||
return __svc_print_addr(svc_addr(rqstp), buf, len);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_print_addr);
|
||||
|
||||
@@ -473,7 +473,7 @@ svc_sendto(struct svc_rqst *rqstp, struct xdr_buf *xdr)
|
||||
/* set the source and destination */
|
||||
struct msghdr msg;
|
||||
msg.msg_name = &rqstp->rq_addr;
|
||||
msg.msg_namelen = sizeof(rqstp->rq_addr);
|
||||
msg.msg_namelen = rqstp->rq_addrlen;
|
||||
msg.msg_iov = NULL;
|
||||
msg.msg_iovlen = 0;
|
||||
msg.msg_flags = MSG_MORE;
|
||||
@@ -696,6 +696,7 @@ svc_write_space(struct sock *sk)
|
||||
static int
|
||||
svc_udp_recvfrom(struct svc_rqst *rqstp)
|
||||
{
|
||||
struct sockaddr_in *sin = svc_addr_in(rqstp);
|
||||
struct svc_sock *svsk = rqstp->rq_sock;
|
||||
struct svc_serv *serv = svsk->sk_server;
|
||||
struct sk_buff *skb;
|
||||
@@ -756,9 +757,12 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
|
||||
rqstp->rq_prot = IPPROTO_UDP;
|
||||
|
||||
/* Get sender address */
|
||||
rqstp->rq_addr.sin_family = AF_INET;
|
||||
rqstp->rq_addr.sin_port = skb->h.uh->source;
|
||||
rqstp->rq_addr.sin_addr.s_addr = skb->nh.iph->saddr;
|
||||
sin->sin_family = AF_INET;
|
||||
sin->sin_port = skb->h.uh->source;
|
||||
sin->sin_addr.s_addr = skb->nh.iph->saddr;
|
||||
rqstp->rq_addrlen = sizeof(struct sockaddr_in);
|
||||
|
||||
/* Remember which interface received this request */
|
||||
rqstp->rq_daddr = skb->nh.iph->daddr;
|
||||
|
||||
if (skb_is_nonlinear(skb)) {
|
||||
@@ -1298,7 +1302,8 @@ svc_sock_update_bufs(struct svc_serv *serv)
|
||||
int
|
||||
svc_recv(struct svc_rqst *rqstp, long timeout)
|
||||
{
|
||||
struct svc_sock *svsk =NULL;
|
||||
struct svc_sock *svsk = NULL;
|
||||
struct sockaddr_in *sin = svc_addr_in(rqstp);
|
||||
struct svc_serv *serv = rqstp->rq_server;
|
||||
struct svc_pool *pool = rqstp->rq_pool;
|
||||
int len, i;
|
||||
@@ -1395,7 +1400,7 @@ svc_recv(struct svc_rqst *rqstp, long timeout)
|
||||
svsk->sk_lastrecv = get_seconds();
|
||||
clear_bit(SK_OLD, &svsk->sk_flags);
|
||||
|
||||
rqstp->rq_secure = ntohs(rqstp->rq_addr.sin_port) < 1024;
|
||||
rqstp->rq_secure = ntohs(sin->sin_port) < PROT_SOCK;
|
||||
rqstp->rq_chandle.defer = svc_defer;
|
||||
|
||||
if (serv->sv_stats)
|
||||
|
Reference in New Issue
Block a user