summaryrefslogtreecommitdiffstats
path: root/usr.sbin/rpc.lockd
diff options
context:
space:
mode:
authorroam <roam@FreeBSD.org>2004-03-04 15:52:28 +0000
committerroam <roam@FreeBSD.org>2004-03-04 15:52:28 +0000
commit1ba594fe27c0870f88926964d8160749f2bf085f (patch)
tree246bd2f9c240f18def0060a157874d94d276dafc /usr.sbin/rpc.lockd
parent89c298d8ab9bdf7e1b4575ac9a727a884087f66b (diff)
downloadFreeBSD-src-1ba594fe27c0870f88926964d8160749f2bf085f.zip
FreeBSD-src-1ba594fe27c0870f88926964d8160749f2bf085f.tar.gz
Make rpc.lockd bind to a reserved port, since there are NFS clients
which ignore NLM requests not coming from a reserved port. PR: 56500 Submitted by: Jonathan Lennox <lennox@cs.columbia.edu> MFC after: 1 week
Diffstat (limited to 'usr.sbin/rpc.lockd')
-rw-r--r--usr.sbin/rpc.lockd/lock_proc.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/usr.sbin/rpc.lockd/lock_proc.c b/usr.sbin/rpc.lockd/lock_proc.c
index edd5117..076f0ee7 100644
--- a/usr.sbin/rpc.lockd/lock_proc.c
+++ b/usr.sbin/rpc.lockd/lock_proc.c
@@ -197,6 +197,8 @@ get_client(host_addr, vers)
const char *netid;
struct netconfig *nconf;
char host[NI_MAXHOST];
+ uid_t old_euid;
+ int clnt_fd;
gettimeofday(&time_now, NULL);
@@ -271,6 +273,22 @@ get_client(host_addr, vers)
return NULL;
}
+ /* Get the FD of the client, for bindresvport. */
+ clnt_control(client, CLGET_FD, &clnt_fd);
+
+ /* Regain root privileges, for bindresvport. */
+ old_euid = geteuid();
+ seteuid(0);
+
+ /*
+ * Bind the client FD to a reserved port.
+ * Some NFS servers reject any NLM request from a non-reserved port.
+ */
+ bindresvport(clnt_fd, NULL);
+
+ /* Drop root privileges again. */
+ seteuid(old_euid);
+
/* Success - update the cache entry */
clnt_cache_ptr[clnt_cache_next_to_use] = client;
memcpy(&clnt_cache_addr[clnt_cache_next_to_use], host_addr,
OpenPOWER on IntegriCloud