525d3066 |
From 5ff0b9e728e23e54001c2bb6df29d85ac2c5e08f Mon Sep 17 00:00:00 2001
From: Alexey Makhalov <amakhalov@vmware.com>
Date: Fri, 25 Mar 2016 21:51:12 +0000
Subject: [PATCH] sunrpc: xs_bind uses ip_local_reserved_ports
---
net/sunrpc/xprtsock.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 2ffaf6a..90543d6 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -1798,9 +1798,11 @@ static unsigned short xs_next_srcport(struct sock_xprt *transport, unsigned shor |
28755687 |
static int xs_bind(struct sock_xprt *transport, struct socket *sock)
{
struct sockaddr_storage myaddr;
- int err, nloop = 0;
+ int err = -EADDRINUSE;
+ int nloop = 0;
unsigned short port = xs_get_srcport(transport);
unsigned short last;
+ struct net *net = transport->xprt.xprt_net;
/*
* If we are asking for any ephemeral port (i.e. port == 0 && |
525d3066 |
@@ -1822,6 +1824,8 @@ static int xs_bind(struct sock_xprt *transport, struct socket *sock) |
28755687 |
memcpy(&myaddr, &transport->srcaddr, transport->xprt.addrlen);
do {
+ if (inet_is_local_reserved_port(net, port))
+ goto next_port;
rpc_set_port((struct sockaddr *)&myaddr, port);
err = kernel_bind(sock, (struct sockaddr *)&myaddr,
transport->xprt.addrlen); |
525d3066 |
@@ -1829,6 +1833,7 @@ static int xs_bind(struct sock_xprt *transport, struct socket *sock) |
28755687 |
transport->srcport = port;
break;
}
+next_port:
last = port;
port = xs_next_srcport(transport, port);
if (port > last) |
525d3066 |
--
1.9.1
|