From e1b14271c85f4aa0a23dfa2036afae7d53e9817c Mon Sep 17 00:00:00 2001 From: Masayuki Ishikawa Date: Wed, 12 May 2021 13:58:20 +0900 Subject: [PATCH] fs: nfs: Do not bind to a local port in TCP mode Summary: - Since binding to a local port is not necessary in TCP mode, it should be done only in UDP mode Impact: - None Testing: - Tested with NFS server on Ubuntu 18.04 (x86_64) - Tested with spresense:rndis (defconfig will be updated later) Signed-off-by: Masayuki Ishikawa --- fs/nfs/rpc_clnt.c | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/fs/nfs/rpc_clnt.c b/fs/nfs/rpc_clnt.c index 46ee90b151b..cdc029dc251 100644 --- a/fs/nfs/rpc_clnt.c +++ b/fs/nfs/rpc_clnt.c @@ -241,28 +241,31 @@ static int rpcclnt_socket(FAR struct rpcclnt *rpc, in_port_t rport) goto bad; } - /* Some servers require that the client port be a reserved port - * number. We always allocate a reserved port, as this prevents - * filehandle disclosure through UDP port capture. - */ - - do + if (rpc->rc_sotype == SOCK_DGRAM) { - *lport = htons(--port); - error = psock_bind(&rpc->rc_so, (FAR struct sockaddr *)&laddr, - addrlen); - if (error < 0) + /* Some servers require that the client port be a reserved port + * number. We always allocate a reserved port, as this prevents + * filehandle disclosure through UDP port capture. + */ + + do + { + *lport = htons(--port); + error = psock_bind(&rpc->rc_so, (FAR struct sockaddr *)&laddr, + addrlen); + if (error < 0) + { + ferr("ERROR: psock_bind failed: %d\n", error); + } + } + while (error == -EADDRINUSE && port >= 512); + + if (error) { ferr("ERROR: psock_bind failed: %d\n", error); + goto bad; } } - while (error == -EADDRINUSE && port >= 512); - - if (error) - { - ferr("ERROR: psock_bind failed: %d\n", error); - goto bad; - } /* Protocols that do not require connections could be optionally left * unconnected. That would allow servers to reply from a port other than