From ffc0634118254dde4449900a65fc8bdb3d7a52d0 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 0030376..c58db46 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -1690,9 +1690,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 && @@ -1714,6 +1716,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); @@ -1721,6 +1725,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