Commit Graph

556 Commits

Author SHA1 Message Date
Siddhesh Poyarekar ea7d8b95e2 Avoid overlapping addresses to stpcpy calls in nscd (BZ #16760)
Calls to stpcpy from nscd netgroups code will have overlapping source
and destination when all three values in the returned triplet are
non-NULL and in the expected (host,user,domain) order.  This is seen
in valgrind as:

==3181== Source and destination overlap in stpcpy(0x19973b48, 0x19973b48)
==3181==    at 0x4C2F30A: stpcpy (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==3181==    by 0x12567A: addgetnetgrentX (string3.h:111)
==3181==    by 0x12722D: addgetnetgrent (netgroupcache.c:665)
==3181==    by 0x11114C: nscd_run_worker (connections.c:1338)
==3181==    by 0x4E3C102: start_thread (pthread_create.c:309)
==3181==    by 0x59B81AC: clone (clone.S:111)
==3181==

Fix this by using memmove instead of stpcpy.
2014-03-27 19:48:15 +05:30
Siddhesh Poyarekar fbd6b5a405 Fix nscd lookup for innetgr when netgroup has wildcards (BZ #16758)
nscd works correctly when the request in innetgr is a wildcard,
i.e. when one or more of host, user or domain parameters is NULL.
However, it does not work when the the triplet in the netgroup
definition has a wildcard.  This is easy to reproduce for a triplet
defined as follows:

    foonet (,foo,)

Here, an innetgr call that looks like this:

    innetgr ("foonet", "foohost", "foo", NULL);

should succeed and so should:

    innetgr ("foonet", NULL, "foo", "foodomain");

It does succeed with nscd disabled, but not with nscd enabled.  This
fix adds this additional check for all three parts of the triplet so
that it gives the correct result.

	[BZ #16758]
	* nscd/netgroupcache.c (addinnetgrX): Succeed if triplet has
	blank values.
2014-03-27 07:15:22 +05:30
Andreas Schwab baaf1dedc9 nscd: also invalidate netgroup cache on reload 2014-03-19 14:45:10 +01:00
Siddhesh Poyarekar c44496df2f Provide correct buffer length to netgroup queries in nscd (BZ #16695)
The buffer to query netgroup entries is allocated sufficient space for
the netgroup entries and the key to be appended at the end, but it
sends in an incorrect available length to the NSS netgroup query
functions, resulting in overflow of the buffer in some special cases.
The fix here is to factor in the key length when sending the available
buffer and buffer length to the query functions.
2014-03-12 17:28:13 +05:30
Siddhesh Poyarekar 8b4ff97413 Mark nscd service as forking in systemd service file (BZ #16639)
Currently the nscd service is installed in systemd as a simple
service, which means that it is able to handle its own errors and does
not quit.  Since nscd does not fit that description, i.e. it can exit
on errors like, say, failing to parse nscd.conf, it should be declared
as forking instead.
2014-03-10 13:17:54 +05:30
Siddhesh Poyarekar 532a60357e nscd: Improved support for tracking startup failure in nscd service (BZ #16639)
Currently, the nscd parent process parses commandline options and
configuration, forks on startup and immediately exits with a success.
If the child process encounters some error after this, it goes
undetected and any services started up after it may have to repeatedly
check to make sure that the nscd service did actually start up and is
serving requests.

To make this process more reliable, I have added a pipe between the
parent and child process, through which the child process sends a
notification to the parent informing it of its status.  The parent
waits for this status and once it receives it, exits with the
corresponding exit code.  So if the child service sends a success
status (0), the parent exits with a success status.  Similarly for
error conditions, the child sends the non-zero status code, which the
parent passes on as the exit code.

This, along with setting the nscd service type to forking in its
systemd configuration file, allows systemd to be certain that the nscd
service is ready and is accepting connections.
2014-03-03 23:18:31 +05:30
Ondřej Bílka a1ffb40e32 Use glibc_likely instead __builtin_expect. 2014-02-10 15:07:12 +01:00
Siddhesh Poyarekar af37a8a349 Avoid undefined behaviour in netgroupcache
Using a buffer after it has been reallocated is undefined behaviour,
so get offsets of the triplets in the old buffer before reallocating
it.
2014-01-27 11:32:44 +05:30
Siddhesh Poyarekar 5d41dadf31 Adjust pointers to triplets in netgroup query data (BZ #16474)
The _nss_*_getnetgrent_r query populates the netgroup results in the
allocated buffer and then sets the result triplet to point to strings
in the buffer.  This is a problem when the buffer is reallocated since
the pointers to the triplet strings are no longer valid.  The pointers
need to be adjusted so that they now point to strings in the
reallocated buffer.
2014-01-24 13:51:15 +05:30
Siddhesh Poyarekar 980cb5180e Don't use alloca in addgetnetgrentX (BZ #16453)
addgetnetgrentX has a buffer which is grown as per the needs of the
requested size either by using alloca or by falling back to malloc if
the size is larger than 1K.  There are two problems with the alloca
bits: firstly, it doesn't really extend the buffer since it does not
use the return value of the extend_alloca macro, which is the location
of the reallocated buffer.  Due to this the buffer does not actually
extend itself and hence a subsequent write may overwrite stuff on the
stack.

The second problem is more subtle - the buffer growth on the stack is
discontinuous due to block scope local variables.  Combine that with
the fact that unlike realloc, extend_alloca does not copy over old
content and you have a situation where the buffer just has garbage in
the space where it should have had data.

This could have been fixed by adding code to copy over old data
whenever we call extend_alloca, but it seems unnecessarily
complicated.  This code is not exactly a performance hotspot (it's
called when there is a cache miss, so factors like network lookup or
file reads will dominate over memory allocation/reallocation), so this
premature optimization is unnecessary.

Thanks Brad Hubbard <bhubbard@redhat.com> for his help with debugging
the problem.
2014-01-16 10:21:52 +05:30
Sami Kerola 0c813d1f3e nscd: list all tables in usage()
Usage output for option --invalidate=TABLE is not helpful without
list of tables.  The list is also missing from nscd(8) manual which
made it pretty difficult to know what are the tables.
2014-01-04 08:44:36 -05:00
Siddhesh Poyarekar 9a3c6a6ff6 Fix return code from getent netgroup when the netgroup is not found (bz #16366)
nscd incorrectly returns a success even when the netgroup in question
is not found and adds a positive result in the cache.  this patch
fixes this behaviour by adding a negative lookup entry to cache and
returning an error when the netgroup is not found.
2014-01-02 10:05:27 +05:30
Siddhesh Poyarekar d41242129b Fix infinite loop in nscd when netgroup is empty (bz #16365)
Currently, when a user looks up a netgroup that does not have any
members, nscd goes into an infinite loop trying to find members in the
group.  This is because it does not handle cases when getnetgrent
returns an NSS_STATUS_NOTFOUND (which is what it does on empty group).
Fixed to handle this in the same way as NSS_STATUS_RETURN, similar to
what getgrent does by itself.
2014-01-02 10:04:21 +05:30
Allan McRae 88726d48af Update remaining copyright dates
Update copyright years that are not handled by scripts/update-copyright.
2014-01-01 22:02:55 +10:00
Allan McRae d4697bc93d Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
Allan McRae 73616a7427 Add systemd unit file for nscd
Provide an example systemd unit and tmpfile for running nscd.
2013-12-16 11:22:01 +10:00
Andreas Schwab 8ec3f656d6 Fix off-by-one in nscd getservbyport call 2013-11-11 12:26:32 +01:00
Mike Frysinger cb8a6dbd17 rename configure.in to configure.ac
Autoconf has been deprecating configure.in for quite a long time.
Rename all our configure.in and preconfigure.in files to .ac.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
2013-10-30 17:32:08 +10:00
Andreas Schwab b2179107f3 Properly cache the result from looking up the nss database config 2013-09-30 10:29:13 +02:00
Allan McRae 83e43bf0b7 Fix nesting of ifdefs in netgroupcache.c
Fixes unclosed '{' if HAVE_SENDFILE is defined (BZ #15895).
2013-09-09 20:25:01 +10:00
Siddhesh Poyarekar 3a30923983 Use __glibc_unlikely instead of __builtin_expect (..., 0) 2013-08-28 09:44:19 +05:30
Siddhesh Poyarekar 595aba70a4 Initialize res_hconf in nscd
Fixes BZ #15890.
2013-08-26 15:42:29 +05:30
Siddhesh Poyarekar e0a69f5cb8 Fix indentation in aicache.c 2013-08-26 10:53:02 +05:30
Siddhesh Poyarekar a31ee4b3a5 Fix typo in comment 2013-06-24 18:07:37 +05:30
Andreas Schwab 50fd745b4d Fix handling of netgroup cache in nscd 2013-06-11 11:29:50 +02:00
Ryan S. Arnold e054f49430 Add #include <stdint.h> for uint[32|64]_t usage (except installed headers). 2013-05-16 11:32:54 -05:00
Andreas Schwab 306dfba9e1 Properly check for short writes when sending the response in nscd 2013-04-15 10:33:52 +02:00
Andreas Schwab 0582f6b3d6 nscd: don't fork twice 2013-04-15 09:49:55 +02:00
Mike Frysinger 6ff444c418 unify xmalloc prototypes & friends
These prototypes are duplicated in many places.  Add a dedicated
header for holding prototypes for program-specific functions to
avoid that.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
2013-02-18 17:16:05 -05:00
Carlos O'Donell 471514d39d Refactor code out of nscd's two main poll loops.
We refactor the inotify file checking code and the
database clearing code out of the main_loop_poll and
mail_loop_epoll functions. We document some the related
functions with appropriate comments.
2013-02-08 12:56:22 -05:00
Roland McGrath f1d70dad53 Remove lots of inline keywords. 2013-02-07 14:44:18 -08:00
Andreas Schwab 33c0a3afc7 Revert "Properly check for short writes when sending the response in nscd"
This reverts commit dd31ac7a8e.
2013-01-10 10:44:04 +01:00
Andreas Schwab 67881f5e92 Revert "* nscd/nscd.h: Move persistent storage back to /var/run/nscd"
This reverts commit 70d3e06ed0.
2013-01-10 10:44:04 +01:00
Andreas Schwab ee32fdd79a Revert "nscd: don't fork twice"
This reverts commit 7e9b080575.
2013-01-10 10:44:04 +01:00
Andreas Schwab 7e9b080575 nscd: don't fork twice 2013-01-10 09:59:59 +01:00
Thorsten Kukuk 70d3e06ed0 * nscd/nscd.h: Move persistent storage back to /var/run/nscd 2013-01-10 09:59:59 +01:00
Andreas Schwab dd31ac7a8e Properly check for short writes when sending the response in nscd
* nscd/grpcache.c (cache_addgr): Properly check for short write.
	* nscd/initgrcache.c (addinitgroupsX): Likewise.
	* nscd/pwdcache.c (cache_addpw): Likewise.
	* nscd/servicescache.c (cache_addserv): Likewise.  Don't write
	more than recsize.
2013-01-10 09:59:58 +01:00
Joseph Myers 568035b787 Update copyright notices with scripts/update-copyrights. 2013-01-02 19:05:09 +00:00
David S. Miller 0549fbba96 Update copyright years.
* catgets/gencat.c: Update copyright year.
	* csu/version.c: Likewise.
	* debug/catchsegv.sh: Likewise.
	* debug/pcprofiledump.c: Likewise.
	* debug/xtrace.sh: Likewise.
	* elf/ldconfig.c: Likewise.
	* elf/ldd.bash.in: Likewise.
	* elf/pldd.c: Likewise.
	* elf/sotruss.ksh: Likewise.
	* elf/sprof.c: Likewise.
	* iconv/iconv_prog.c: Likewise.
	* iconv/iconvconfig.c: Likewise.
	* locale/programs/locale.c: Likewise.
	* locale/programs/localedef.c: Likewise.
	* login/programs/pt_chown.c: Likewise.
	* malloc/memusage.sh: Likewise.
	* malloc/memusagestat.c: Likewise.
	* malloc/mtrace.pl: Likewise.
	* nscd/nscd.c: Likewise.
	* nss/getent.c: Likewise.
	* nss/makedb.c: Likewise.
	* posix/getconf.c: Likewise.
2013-01-01 00:11:43 -08:00
Jeff Law 2af1b32853 [BZ #13761]
* nscd/grpcache.c (cache_addgr): Rename alloca_used to
        dataset_temporary.  Track alloca usage into alloca_used.
        If dataset is large allocate and release it via malloc/free.
2012-11-29 10:46:19 -07:00
Joseph Myers 8b748aed2a Support --with-pkgversion and --with-bugurl. 2012-11-09 22:13:45 +00:00
Roland McGrath 6e6249d0b4 BZ#14743: Move clock_* symbols from librt to libc. 2012-10-24 14:50:46 -07:00
Dmitry V. Levin fc997c6e55 nscd: fix compilation flags
Commit 61653dfb81 added support for
compilers predefining _FORTIFY_SOURCE by adding -U_FORTIFY_SOURCE to
CPPFLAGS for these compilers, but that change doesn't work quite well in
case of nscd: its Makefile sets _FORTIFY_SOURCE using CFLAGS instead of
CPPFLAGS and, thanks to compilation rules defined in Makerules, CPPFLAGS
are passed to compiler after CFLAGS, resulting to a build with
_FORTIFY_SOURCE turned off.

This change implements a more safe method of passing preprocessor and
compiler flags so that no nscd modules could be accidentally forgotten.
2012-10-02 19:22:57 +00:00
Roland McGrath f04e213208 Fix shadow, gshadow, networks, protocols, rpc, aliases, and nscd routines for USE_NSCD case. 2012-08-22 16:06:53 -07:00
Roland McGrath c53d909c80 Add --disable-build-nscd configure option. 2012-08-22 13:35:55 -07:00
Roland McGrath 3cc3ef96d6 BZ#13696: Add --disable-nscd configure option. 2012-08-22 13:31:12 -07:00
Joseph Myers 89b4b02f42 Remove pre-2.4.21 Linux kernel support. 2012-07-25 21:19:13 +00:00
Roland McGrath 6540185fb9 Fix formatting in last change. 2012-05-15 11:45:42 -07:00
Andreas Jaeger 509072a0f7 Avoid race in nscd
2012-05-15  Jeff Law  <law@redhat.com>
            Andreas Jaeger  <aj@suse.de>

        [BZ #13594]
        * nscd/nscd-client.h (__nscd_acquire_maplock): New function, split
        out from...
        * nscd/nscd_helper.c (__nscd_get_map_ref): ... here.
        * nscd/nscd-client.h: Add __nscd_acquire_maplock.
        * nscd/nscd_gethst_r.c (__nscd_get_nl_timestamp): Add locking to
        code changing __hst_map_handle.map.
2012-05-15 20:37:05 +02:00
Thomas Schwinge 37233df9d1 Hurd: #include <kernel-features.h> 2012-05-10 15:57:24 -07:00
Andreas Jaeger edfe0dbebd Cleanup nscd.c
2012-05-09  Andreas Jaeger  <aj@suse.de>

	* nscd/nscd.c (run_modes): Make named enum, reorder so that
	default is first entry.
	(run_mode): Set type.
	(main): Remove informal message about syslog.
	(options): Fix typo.
2012-05-09 21:34:47 +02:00
Andreas Jaeger 91d8d69ec6 Cleanup last patch for nscd/nscd.c
* nscd/nscd.c (run_mode): Use enum.
	(main): Cleanup coding style issue.
2012-05-09 17:42:15 +02:00
Andreas Jaeger bb90b80baa Add --foreground option for nscd
For a better integration of nscd with systemd, we should run nscd not as
daemon but in the foreground. A new --foreground option should be added.

2012-05-09  Alexandre Oliva  <aoliva@redhat.com>
	    Andreas Jaeger  <aj@suse.de>

        * nscd/nscd.c (go_background): Replaced with...
        (run_mode): ... this.
	(RUN_FOREGROUND, RUN_DAEMONIZE, RUN_DEBUG): Add.
        (options): Add -F --foreground.
        (main): Implement it.
        (parse_opt): Parse it.
2012-05-09 16:54:38 +02:00
Paul Pluzhnikov 3ff4252677 2012-03-23 Daniel Jacobowitz <dmj@google.com>
Paul Pluzhnikov  <ppluzhnikov@google.com>

	[BZ #6528]
	* grp/Makefile (otherlibs): Don't set it.
	* inet/Makefile (otherlibs): Likewise.
	* login/Makefile (otherlibs): Likewise.
	* nscd/Makefile (otherlibs): Likewise.
	* posix/Makefile (otherlibs): Likewise.
	* pwd/Makefile (otherlibs): Likewise.
	* rt/Makefile (otherlibs): Likewise.
	* sunrpc/Makefile (otherlibs): Likewise.
	* nss/Makefile (otherlibs): Likewise.
	Add libnss_files to routines and static-only-routines.
	($(objpfx)getent): Remove rule.
	* resolv/Makefile: Add libnss_dns and libresolv to routines and
	static-only-routines.
2012-03-23 09:47:03 -07:00
H.J. Lu eb96ffb07d Move stdio-common/_itoa.h to sysdeps/generic 2012-03-20 16:00:23 -07:00
Ulrich Drepper a4300c7a4d Remove distribute variable from Makefiles 2012-03-07 05:17:13 -05:00
Paul Eggert 59ba27a63a Replace FSF snail mail address with URLs. 2012-02-09 23:18:22 +00:00
Ulrich Drepper 3e1aa84e7f Do not cache negative results in nscd if these are transient 2012-01-20 22:39:54 -05:00
Ulrich Drepper ec09c1c410 Optimize xmalloc, xcalloc, xrealloc, and xstrdup
Add alloc_size attribute and apply consistently the malloc attribute
to xmalloc, xcalloc, xrealloc, and xstrdup.
2012-01-08 21:19:43 -05:00
Ulrich Drepper 81fb02b046 Update copyright year 2012-01-01 05:50:05 -05:00
Ulrich Drepper 9bea34736f Avoid warning in aicache.c 2011-12-02 21:05:19 -05:00
Andreas Schwab a9ae54a136 Don't start AVC thread until credentials are installed 2011-11-03 14:41:38 +01:00
Andreas Schwab 45b96dd684 Properly set extra-objs in nscd makefile 2011-11-01 18:28:38 +01:00
Ulrich Drepper 432d41ceec Use kernel headers for netlink definitions 2011-11-01 08:43:33 -04:00
Ulrich Drepper 3a2c02424d Cache network interface information
Whenever getaddrinfo needed network interface information it used the
netlink interface to read the information every single time.  The
problem is that this information can change at any time.

The patch implements monitoring of the network interfaces through
nscd.  If no change is detected the previously read information can
be reused (which is the norm).  This timestamp information is also
made available to other processes using the shared memory segment
between nscd and those processes.
2011-10-31 01:51:16 -04:00
Ulrich Drepper 97c066e65a Fix nesting of #ifdefs in netgroupcache.c 2011-10-17 10:30:03 -04:00
Roland McGrath c658d255e9 Fix some nit warnings. 2011-10-08 15:25:08 -07:00
Ulrich Drepper 684ae51599 Implement caching of nscd 2011-10-07 10:06:31 -04:00
Ulrich Drepper 21fd49a9ef Don't unnecesarily use inotify in nscd 2011-10-07 01:20:53 -04:00
Ulrich Drepper 32b63198d6 Avoid warning when reload of group entry fails 2011-10-06 03:44:19 -04:00
Ulrich Drepper a60df2c3db Add missing initialization in service cache in nscd 2011-08-14 22:20:09 -04:00
Marek Polacek b902330ca8 Avoid warning in nscd config file parsing code 2011-07-19 20:13:31 -04:00
Ulrich Drepper feb1eb0be7 Avoid possible crashes in anormal nscd exits 2011-07-19 13:59:57 -04:00
Ulrich Drepper 319b9ad4bc Generalize framework to register monitoring of files in nscd
nscd can clear caches when certain files change.  The list of files
was hardcoded so far and worked for nss_files and nss_dns and those
modules which need no monitoring.  nss_db, for instance, has its
own set of files to monitor.  Now the NSS modules themselves can
request that certain files are monitored.
2011-07-11 14:50:24 -04:00
Ulrich Drepper f15f1e45ba Avoid warning. 2011-07-05 06:56:12 -04:00
Ulrich Drepper 99231d9abe nscd cleanups
Cleanup and optimize last patch.  Add timeout fixes also to the
services cache.
2011-07-01 23:02:09 -04:00
Thorsten Kukuk 445b4a53ea Handle nscd negtimeout==0 2011-07-01 22:53:01 -04:00
Ulrich Drepper cf3b23ffcd Avoid write to invalid file descriptor in nscd
When readding entries to the group and services cache and the lookup
is unsuccesful, we tried to write the notfound record.  Just don't
do it in this case.
2011-06-29 23:33:38 -04:00
Ulrich Drepper 034807a9cb Fix handling of RES_USE_INET6 big in nscd
This fixes BZ #12350 also for nscd.
2011-06-27 13:10:44 -04:00
Roland McGrath 5615eaf264 Quash some new warnings from GCC 4.6. 2011-06-10 22:44:20 -07:00
Ulrich Drepper c8fc0c9169 Don't free non-malloced memory and fix memory leak 2011-05-31 08:45:44 -04:00
Ulrich Drepper f2962a7195 Add a few more alloca size checks 2011-05-22 23:04:16 -04:00
Andreas Schwab da62f81bdd Add support for generated PIE link rules 2011-05-13 23:31:43 -04:00
Jim Meyering ded5b9b7c7 Remove doubled words. 2011-04-22 21:34:32 -04:00
Justin P. Mattock 795934a60e Fix a comment. 2011-04-17 20:55:16 -04:00
Ulrich Drepper a4c7ea7bb8 Schedule nscd cache pruning more accurately fromr re-added values. 2011-02-05 20:07:27 -05:00
Ulrich Drepper c0dafcf176 Update copyright year. 2011-01-17 15:08:10 -05:00
Ulrich Drepper bc425b339b Signal temporary host lookup errors in nscd as such to the requester. 2011-01-15 11:10:11 -05:00
Ulrich Drepper ea42a20cae Fix crash on reloading of gai data in nscd. 2010-04-09 21:38:20 -07:00
Ulrich Drepper d55d558b4e Print reload count in nscd statistics. 2010-04-08 19:58:29 -07:00
Ulrich Drepper 561470e061 Update copyright year. 2010-03-15 11:50:59 -07:00
Ulrich Drepper 351fe94770 Try harder to re-exec nscd in paranoia mode. 2009-11-22 19:07:52 -08:00
Anders Johansson ea547a1a6e Fix a few asserts and IO calls in nscd.
The nscd/*cache.c files contain assert()s, writeall() and sendfileall() calls
that invalidly use together &dataset->resp and total where either dataset or
dataset->head.recsize should be used instead one of the components. In the
writeall() and sendfileall() cases, it is unlikely to matter in practice, but
the assertions can fail sometimes without a proper reason.
2009-10-29 22:18:26 -07:00
Ulrich Drepper e0f471a118 Print timestamp in nscd debug messages. 2009-10-29 13:45:10 -07:00
Ulrich Drepper 00ebd7ed58 Revert "Fix lock handling in memory hander of nscd."
This reverts commit 137028b4d7.

Conflicts:

	ChangeLog
2009-07-17 07:49:16 -07:00
Petr Baudis 137028b4d7 Fix lock handling in memory hander of nscd.
The commit 20e498bd removes the pthread_mutex_rdlock() calls, but not the
corresponding pthread_mutex_unlock() calls. Also, the database lock is never
unlocked in one branch of the mempool_alloc() if.

I think unreproducible random assert(dh->usable) crashes in prune_cache() were
caused by this. But an easy way to make nscd threads hang with the broken
locking was.
2009-07-16 10:10:10 -07:00
Andreas Schwab 50158f9552 Use correct release semantic in list update.
nscd uses lockfree lists and we need to ensure the correct release
semantics is used when adding to the list.
2009-07-16 09:57:32 -07:00
H.J. Lu 435aa54b3b Consolidate PIE linking Makefile rules. 2009-06-16 09:19:59 -07:00
Jakub Jelinek 5078fff6c4 Fix forced loop termination in nscd database lookup.
There are two issues with the forced loop exit in the nscd lookup:
1. the estimate of the entry size isn't pessimistic enough for all
   databases, resulting potentially is too early exits
2. the combination of 64-bit process and 32-bit nscd would lead to
   rejecting valid records in the database.
2009-05-18 10:19:50 -07:00
Ulrich Drepper fa546abe9d Move BLOCK_ALIGN* macros back.
The move to nscd-client.h was only needed for some interim version
of the patch.  The final version doesn't need it.  Undo the change.
2009-05-16 10:29:43 -07:00