diff options
author | roam <roam@FreeBSD.org> | 2004-03-04 15:52:28 +0000 |
---|---|---|
committer | roam <roam@FreeBSD.org> | 2004-03-04 15:52:28 +0000 |
commit | 1ba594fe27c0870f88926964d8160749f2bf085f (patch) | |
tree | 246bd2f9c240f18def0060a157874d94d276dafc /usr.sbin | |
parent | 89c298d8ab9bdf7e1b4575ac9a727a884087f66b (diff) | |
download | FreeBSD-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')
-rw-r--r-- | usr.sbin/rpc.lockd/lock_proc.c | 18 |
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, |