Kevin Coffman [Thu, 8 Feb 2007 22:27:25 +0000 (17:27 -0500)]
Use the gssglue version of gssapi.h for svcgssd_mech2file.c
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
Remove Kerberos implementation dependency from svcgssd_mech2file.c Signed-off-by: Neil Brown <neilb@suse.de>
Kevin Coffman [Thu, 8 Feb 2007 22:27:19 +0000 (17:27 -0500)]
Stop using storage after free
Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
The previous patch seems to expose a use after free bug in dirscancb. At
least, I could reliably reproduce a segfault by doing a bunch of mounts
and then unmounting them all. The code uses the following list macro:
TAILQ_FOREACH(ic, icq, ic_next) {
...to iterate over all of the ic entries and clean up any that no longer
have a corresponding directory in rpc_pipefs. This macro unrolls into:
for(ic=icq->tqh_first; ic != NULL; ic=ic->ic_next.tqe_next) {
...but within this loop, we can free ic, and then the for loop can trip
over that when it tries to do the iteration. The attached patch works
around this by not using the TAILQ_FOREACH macro and saving off the
tqe_next pointer prior to the free.
Again, this was tested on a patched 1.0.6, but the 1.0.10 code is very
similar, and I think the problem exists there as well. Signed-off-by: Neil Brown <neilb@suse.de>
Kevin Coffman [Thu, 8 Feb 2007 22:27:14 +0000 (17:27 -0500)]
Fix memory leak in idmapd.
Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
There is a pretty nasty memory leak in idmapd in dirscancb(). Some of
our customers have reported that idmapd can eat gigabytes of memory on
machines with a large number of mounts and unmounts and a long uptime.
That function uses scandir(), which malloc's an array of strings, but
dirscancb() never frees the strings or the array. The following patch
should correct this, but I've not yet tested it on 1.0.10 (only on the
RHEL4 1.0.6 version). Still, the code is very similar and I'm fairly
certain the problem exists in both versions. Signed-off-by: Neil Brown <neilb@suse.de>
Kevin Coffman [Thu, 8 Feb 2007 22:27:09 +0000 (17:27 -0500)]
Treat GSSAPI error codes as unsigned.
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
GSSAPI error codes (major and minor) are defined as unsigned values.
However, we treat them as signed while passing them down to the
kernel where conversion fails if they include the minus sign.
Convert them as unsigned. Signed-off-by: Neil Brown <neilb@suse.de>
Kevin Coffman [Thu, 8 Feb 2007 22:26:59 +0000 (17:26 -0500)]
Add AM_MAINTAINER_MODE to configure.in
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
As requested by "Steinar H. Gunderson" <sgunderson@bigfoot.com>, add
AM_MAINTAINER_MODE to configure.in. See the description of this
macro below:
`AM_MAINTAINER_MODE' disables the so called "rebuild rules" bys
default. If you have `AM_MAINTAINER_MODE' in `configure.ac', and
run `./configure && make', then `make' will *never* attempt to
rebuild `configure', `Makefile.in's, Lex or Yacc outputs, etc.
I.e., this disables build rules for files which are usually
distributed and that users should normally not have to update.
If you run `./configure --enable-maintainer-mode', then these
rebuild rules will be active. Signed-off-by: Neil Brown <neilb@suse.de>
Kevin Coffman [Thu, 8 Feb 2007 22:26:53 +0000 (17:26 -0500)]
Touch up some of the autotools files
Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
this patch touches up the autotool code a bit in nfs-utils:
- run autogen.sh with -e so if something fails, it'll abort properly
- set ACLOCAL_AMFLAGS so that when running autoreconf or when
autotools re-runs itself, the m4 files are found properly
- make sure we include bsdsignals.m4 in the final tarball
- add some cross-compiling fallback logic to bsdsignals.m4 so that
when cross-compiling nfs-utils, the configure is a bit more nice
than simply:
checking for BSD signal semantics... configure: error: cannot run test program while cross compiling Signed-off-by: Neil Brown <neilb@suse.de>
Neil Brown [Mon, 5 Feb 2007 04:37:55 +0000 (15:37 +1100)]
Make UDP sockets not blocking
This is needs if mountd is running multithreaded else multiple threads
will be blocked on a UDP port with nothing to read and so won't
be able to serve up-calls from the kernel.
Thanks to "Murali Krishna V" <vm.krishna@gmail.com> for highlighting
the problem.
J. Bruce Fields [Thu, 1 Feb 2007 17:38:47 +0000 (12:38 -0500)]
Update README
The README has bit-rotted: redhat and debian packaging scripts are no
longer included, util-linux mount is (in theory) no longer required, and
instructions on building from latest git would be useful.
Signed-off-by: "J. Bruce Fields" <bfields@citi.umich.edu> Signed-off-by: Neil Brown <neilb@suse.de>
bzero has been deprecated
for years (and anything starting with __ is an internal
function anyhow), and __bzero seems to have broken on ia64
not too long ago.
This mostly takes care of the difference between
- and \-; in man pages, the former is hyphen
(which indicates, among others, that a line might
be split at that point), while the latter is a
dash. For options, the latter is correct.
Implement default options in /etc/exports, to fix a long-standing wishlist
bug in Debian. (The user claims the syntax matches that of OpenBSD.) This
makes it possible to write "/srv/www -sync,no_subtree_check host1 host2 host3"
instead of having to write (sync,no_subtree_check) over and over and over
again, driving the administrator slowly mad. Such option lines can be
placed anywhere on the line, and affects anything after them (I do not
know if OpenBSD allows this). The patch is slightly convoluted in order to
avoid triggering spurious warnings; for instance, we want
"/srv/www -sync host1" to trigger a warning, but not "/srv/www
-sync,no_subtree_check host1" or "/srv/www -sync host1(no_subtree_check)".
There was also a suggestion for a truly global (ie. per-file) option list,
but this seemed like the safest bet, given that it matches that of other
implementations.
Also, the man page is updated with information on the new possibilities,
and an example.
Signed-off-by: Steinar H. Gunderson <sesse@debian.org> Signed-off-by: Neil Brown <neilb@suse.de>
Make mountd complain on unsupported uid mapping schemes
The NFS kernel server does not support uid mappings, activated with flags
such as "map_daemon" in exports. There is already code that parses these
flags, and gives an error at mount time if an unsupported flag (ie. any
but the default) is given. However, at some point the kernel changed the
export interface, and the new code forgot to include the relevant check.
Thus, simply copy the check from the old to the new code, which makes
sure mountd behaves the same in this aspect regardless of kernel version,
and makes sure the admin does not inadvertently use map_daemon and expect
it to work.
Signed-off-by: Steinar H. Gunderson <sesse@debian.org>
Neil Brown [Sun, 4 Feb 2007 21:57:36 +0000 (08:57 +1100)]
Never set flushtime for a cache in the future.
If 'etab' happens to have a timestamp in the future, this will get
copied to the flush-time for various caches, and no exports will
work until that time arrives. So clamp the flushtime to 'now'.
Neil Brown [Thu, 11 Jan 2007 01:51:29 +0000 (12:51 +1100)]
Ensure 'showmount -e' gets current information.
If auth_reload has been called by someone else, get_exportlist
can incorrectly return old data. So track modify times better
and only use cached data if the modify time matches.
Jeff Layton [Tue, 19 Dec 2006 16:59:07 +0000 (11:59 -0500)]
add missing long option for -r in mountd
I forgot a bit of code that needs to go into patch 3 that I posted yesterday.
This adds a long option for the -r option. I'll post manpage update patches
once I get them written up.
Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Neil Brown <neilb@suse.de>
Ian Kent [Tue, 19 Dec 2006 11:16:17 +0000 (20:16 +0900)]
Reduce showmount timeouts.
Showmount itself tries to use a short timeout but
the RPC clnttcp_create and clntudp_create calls will call portmap
internally to get the port to use if it is set to 0 in the passed
address structure. The above calls then use the internal timeouts,
basically 60 seconds, which slows things down. Also the for tcp a
blocking connect is used which can take quite a while to timeout as
well.
showmount tries tcp then udp so a fail can go through several lengthy
waits before failing.
I've grabbed some of the autofs code and put together a patch to allow
specification of the timeouts for the portmap getport and to implement a
non-blocking connect.
Neil Brown [Mon, 18 Dec 2006 22:44:17 +0000 (09:44 +1100)]
nhfsstone remove due to license uncertainty.
It isn't clear the the License (See DISCLAIMER) is GPLv2 compatable,
and it is believed that the code is largely unused, so get rid
of nhfsstone just to be safe.
Jeff Layton [Mon, 18 Dec 2006 20:44:11 +0000 (15:44 -0500)]
add -r flag to make mountd do reverse resolve of ipaddress on the fly
For those that want "traditional" showmount -a behavior from their mountd
(hostname:/path instead of ipaddr:/path). This patch adds a '-r' flag that
does a reverse-resolve for each IP address listed in the rmtab when
a dump operation is called.
Probably not a good idea for those concerned about performance, but since it's
not the default option, I don't see it being an issue.
Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Neil Brown <neilb@suse.de>
Jeff Layton [Mon, 18 Dec 2006 20:43:56 +0000 (15:43 -0500)]
remove extraneous mountlist_add/del calls and change remaining ones to use IP addresses
Neil suggested a patch to change the mountlist_add and mountlist_del calls to
use IP addresses instead of the names returned by client_compose based on a
command line option flag.
I don't see any real reason to put client_compose strings into the rmtab, so
this patch makes it so that it adds IP addresses instead of those strings to
the rmtab by default.
It also removes all mountlist_add calls that are being done from kernel cache
routines. My main concern there is NFSv4. We don't seem to make any upcalls to
mountd on NFSv4 unmounts, and I don't see a way to reliably remove NFSv4
entries. So, I figured I'd stick with having mountlist_add only called when
a v2 or v3 mount call is made, and mountlist_del called only on the
corresponding unmount call.
Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Neil Brown <neilb@suse.de>
Jeff Layton [Mon, 18 Dec 2006 20:43:16 +0000 (15:43 -0500)]
Don't rely on old info in my_client
Here's a new set of patches to fix up "showmount -a", based on the approach
suggested by Neil. This first patch is fairly simple. It just stops
the current caching of my_client.
For an explanation, consider this situation with the current code:
1) Client mounts an NFS export from server that is restricted to a particular
hostname or netgroup.
2) DNS or netgroup changes so that the client would be denied.
3) Client attempts mount again. Mount succeeds, even though it shouldn't due
to the fact that mountd relies on cached info in my_client.
This situation can occur as long as no other client attempts a mount between
1 and 3 above. The patch below removes this caching, and causes a new
invocation of client_compose for each pass through auth_authenticate:
Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Neil Brown <neilb@suse.de>
Ian Kent [Thu, 14 Dec 2006 11:34:52 +0000 (20:34 +0900)]
nfs-utils - mtab locking needed on add as well as update
Hi all,
I noticed some mtab corruption the other day when doing some autofs
testing but thought nothing of it.
When investigating another issue I came across utils/mount.c:add_mtab
which looks like it adds an entry to /etc/mtab without performing
correct locking. Perhaps this is not needed when adding entries but I
think it is.
The getopt_long() option string in mountd was having a spurious
colon after the 'n', leading to the short form of --no-tcp not
being usable (expecting a parameter, contrary to the long form
and the documentation). Fix.
The exports(8) man page already mentions that some non-root users,
such as bin, might be just as sensitive as root, and that root_squash
thus might not be as effective as one could hope for. Update the
documentation to also mention that this could be the case for non-root
groups, such as staff.
Kevin Coffman [Fri, 13 Oct 2006 19:36:03 +0000 (15:36 -0400)]
Allow gssd ccaches in MEMORY: rather than FILE:
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
Add option to store gssd ccaches in a MEMORY: cache rather
than the default FILE: cache. In response to suggestion
from Steve Dickson <steved@redhat.com> and
Nalin Dahyabhai <nalin@redhat.com>.
Signed-off-by: Olga Kornievskaia <aglo@citi.umich.edu> Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
Implement a new version of lucid spkm3 context which is passed
down to the kernel.
J. Bruce Fields [Fri, 13 Oct 2006 19:35:52 +0000 (15:35 -0400)]
Don't always use default mapping to "nobody".
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
We've been ignoring all mapping errors and instead mapping to a "nobody" user
or group.
This is arguably OK for the cases where we're returning a value to the user
(so, id->name mapping on the server or name->id mapping on the client).
But it's a disaster in the other direction (id->name on the server or id->name
on the client): for example, a chown to an unknown user should *not*
automatically be translated into a succesful chown to "nobody".
This patch fixes that problem on the server side.
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
did447@gmail.com [Fri, 13 Oct 2006 19:35:38 +0000 (15:35 -0400)]
On a glibc system gethostbyname is in libc not libnsl
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
Change configure test for gethostbyname, and properly
determine whether "-lnsl" or "-lsocket" are really
required.
Kevin Coffman [Fri, 13 Oct 2006 19:35:32 +0000 (15:35 -0400)]
Restore extra help for PKG_CONFIG error
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
Fix the error message printed when pkg-config is unable to locate
information for librpcsecgss so the message is actually printed.
Neil Brown [Mon, 7 Aug 2006 06:40:50 +0000 (16:40 +1000)]
Set version to 1.0.10
Note: 1.0.10 should be used in preference to
1.0.9 especially with kernels 2.6.18 and later
otherwise 'rpc.nfsd N' won't work to change the
number of threads after nfsd has been started.
Neil Brown [Mon, 7 Aug 2006 06:37:13 +0000 (16:37 +1000)]
"rpc.nfsd XX" should not fail if ports are already open.
support/nfs/nfssvc.c: if any ports are already open,
don't try to open any more.
This means that once nfsd is running
rpc.nfsd X
will just change the number of threads, not the
ports in use.
Kevin Coffman [Sat, 8 Jul 2006 00:01:40 +0000 (10:01 +1000)]
Use uid/gid of -1 to indicate the export's anonuid/anongid should be used
Kernel routine nfsd_setuser() in fs/nfsd/auth.c checks for the
value -1 and defaults the credential's fsuid/fsgid to the
correct anonuid/anongid values for the given export. We should
be passing this value (-1) down when a name mapping cannot be found.
Thanks to J. Bruce Fields <bfields@fieldses.org> for the reference.
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu> Acked-by: J. Bruce Fields <bfields@fieldses.org>
Neil Brown [Fri, 7 Jul 2006 23:41:58 +0000 (09:41 +1000)]
Disable building/installing mount.nfs by default.
mount.nfs does not yet support 'user' option and some others.
To make it support this we need to make it setuid-root, and
some security isses need to be resolved before that can be done
safely.
Don't depend on Kerberos headers when checking librpcsecgss in configure
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
Older versions of MIT Kerberos are missing an OID definition, causing
the configure checks for librpcsecgss to fail. We shouldn't be depending
on their libraries during the configure.
- unused variable 'buf'
- emit a declaration for `buf' on demand.
- unused variable 'i'
- declare i immediately before use
- unused value from IXDR_PUT_
- cast to (void)
- type-punned pointer reference
- cast to (void*) first :-(
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
Temporary patch to do default mapping if we get an error while trying to
map a gss principal to the appropriate uid/gid. This currently returns
hardcoded values. This may be correct, or we may need to try and figure
out the correct values to match the anonuid/anongid for the export.
Change default buffer size increment for readline()
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
The readline routine expects much smaller messages than we are passing.
Change the default initial allocation and increment value from 128
to 2048. This saves many calls to realloc().
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
Update the printerr() function to:
1) Determine whether we'll print the message before going to all the
work of formatting it.
2) Don't just toss away messages that are too long for the buffer.
Print what we can and give an indication of the truncation with
"..." at the end.
3) Use a single buffer rather than two.
4) Messages either go to syslog (with level ERR) or stderr. Don't
send some messages to syslog level DEBUG.
Use setfsuid() rather than seteuid() while creating contexts
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
As suggested by Olaf Kirch <okir@suse.de>, use setfsuid() rather than
seteuid() when creating a gss context. This prevents users from using
credentials that do not belong to them, while also preventing them from
doing things like killing, renicing, or changing the priority of the
gssd process while it is processing the context creation.
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
Specify that the acquire_cred call should only be concerned with returning
Kerberos credentials since this is Kerberos-only functionality.
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
Do a call to determine mechanisms supported by the gssapi library early.
This allows us to discover early in case the gssapi library is somehow
misconfigured. We can bail out early and give a meaningful message
rather than getting errors on each attempt at a context negotiation.
Signed-off-by: Kevin Coffman <kwc@citi.umich.edu>
Correct the definition of mech_used in the gss context to use gss_OID_desc.
This fixes problems on 64-bit machines when referencing the OID.
Also updates write_buffer function to use u_int rather than size_t when
doing calculations.
Steve Dickson [Sun, 2 Jul 2006 23:52:00 +0000 (09:52 +1000)]
Allow rpc.nfsd to suppress tcp or udp, and listen on a specific address.
-T - will suppressing listening for TCP connection.
-U - will suppress UDP
-H host - will only listen on that local address
-p port - will listen on that port.
This requires kernel patches which will hopefully be in 2.6.19 and possibly some
earlier test and vendor kernels.
Greg Banks [Tue, 27 Jun 2006 11:22:59 +0000 (21:22 +1000)]
Comment out the decades-old SCCS id strings from the original Sun
distribution. They cause compile warnings, there is no longer any
reason to try to build them into the binaries, and gcc seems to be
eliding some of them anyway.
Neil Brown [Fri, 23 Jun 2006 03:37:08 +0000 (13:37 +1000)]
Try to make sure that clientid used for NFSv4 is reliable.
We need to give an IP address to identify this client to the
server.
The current code does a gethostbyname of the hostname. One
some systems this returns 127.0.0.1 or similar, which is not useful.
Instead, use getsockname of the sock used to connect to the server
to confirm that the server is working. This gives the address on the
interface that was chosen to talk to that server, which is the
best address we can find (if there is a NAT in the way, it might
still not work, but in that case there is nothing we can do).
Greg Banks [Wed, 14 Jun 2006 12:48:10 +0000 (22:48 +1000)]
multiple threads for mountd
How about the attached patch against nfs-utils tot? It
adds a -t option to set the number of forked workers.
Default is 1 thread, i.e. the old behaviour.
I've verified that showmount -e, the Ogata mount client,
and a real mount from Linux and IRIX boxes work with and
without the new option.
I've verified that you can manually kill any of the workers
without the portmap registration going away, that killing
all the workers causes the manager process to wake up and
unregister, and killing the manager process causes the
workers to be killed and portmap unregistered.
I've verified that all the workers have file descriptors
for the udp socket and the tcp rendezvous socket, that
connections are balanced across all the workers if service
times are sufficiently long, and that performance is
improved by that parallelism, at least for small numbers
of threads. For example, with 60 parallel MOUNT calls
and a testing patch to make DNS lookups take 100 milliseconds
time to perform all mounts (averaged over 5 runs) is: