From 5ff0b9e728e23e54001c2bb6df29d85ac2c5e08f Mon Sep 17 00:00:00 2001 From: Alexey Makhalov 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 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 && @@ -1822,6 +1824,8 @@ static int xs_bind(struct sock_xprt *transport, struct socket *sock) 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); @@ -1829,6 +1833,7 @@ static int xs_bind(struct sock_xprt *transport, struct socket *sock) transport->srcport = port; break; } +next_port: last = port; port = xs_next_srcport(transport, port); if (port > last) -- 1.9.1