mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2024-11-18 17:00:49 +01:00
76064c01e5
In ypserv: yp_svc.c: - small signal handler tweak (hopefully the last): just use sigemptyset() to clear sa_mask. Makefile.yp: - Let the user specify the location of master.passwd when updating maps (e.g. make MASTER_PASSWD=/some/path/to/master.passwd). Editing the file to change the location of master.passwd still works. This is mostly to let yppassswdd specify the name of the master.passwd file itself. In yppasswdd: yppasswdd.c: - Roll in some minor changes (mostly casts) from Olaf Kirch's latest yppasswd package release (version 0.7). - Use daemon() instead of doing all the deamonizing gruntwork ourselves. - Call pw_init() after daemonizing ourselves. pw_init() sets up some resource limits and blocks some signals for us. We used to do this before every password change, but there's really no point in calling it more than once during the life of the program. - Change install_reaper() so that we can use it to de-install the SIGCHLD handler if we need to (and we do in pw_mkdb() -- this is what I get for splicing code from two different programs together). - Use sigemptyset(&act.sa_mask) rather than act.sa_mask = 0: the latter is decidedly non-portable. (In IRIX, HP-UX and Solaris, sigset_t is an array of longs, not an int.) update.c: - Roll in change from new version (check that we're not modifying an NIS entry in validate_args()). - Get rid of call to pw_init() (moved to yppasswdd.c). - Check return values from pw_util routines and return error status to yppasswd clients if there's a problem. - Straighten out password file copying mechanism a little. Keep a grip on the original password file rather than summarily overwriting it so that we can restore everything if we fail to fork() a process to update the NIS maps. - Pass the name of the password template file (specified with -m or /etc/master.passwd by default) to the yppwupdate script, which in turn should now pass it to /var/yp/Makefile. pw_util.c: - Nuke the pw_edit() and pw_prompt() functions -- we don't need them. - Change all warn()s, warnx()s and err()s to syslog()s. - Make sure we return error status to caller rather than bailing out in pw_lock() and pw_tmp(). - Don't block SIGTERM in pw_init() (by ignoring SIGTERM, we prevent yppasswdd from being shut down cleanly). - Don't let pw_error() exit. (This stuff was stolen from chpass and vipw which are interactive programs; it's okay to let pw_error() bail out for these programs, but not in a daemon like yppasswdd). - Fix signal handling in pw_mkdb (we need to temporarily de-install the SIGCHLD handler so that we can wait on the pwd_mkdb child ourselves). pw_copy.c: - Change all warn()s, warnx()s and err()s to syslog()s. - Add a bunch of returns() and make pw_copy() return and int ( 0 on success, -1 on failure) so that update.c can flag errors properly. - Return -1 after calling pw_error() to signal failures rather than relying on pw_error() to bail out. - Abort copying if we discover that we've been asked to change an entry for a user that exists in the NIS passwd maps but not in the master.passwd template file. This can happen if the passwd maps and the template file fall out of sync with each other (or if somebody tries to spoof us). The old behavior was to create add the entry to the password file, which yppasswdd should not do under any circumstances. Makefile: - update VERSION to 0.7 yppasswdd.8: - fix typo (forgot a carriage return somewhere) - remove bogus reference to pwunconv(8) which FreeBSD doesn't have. - bump version from 0.5 to 0.7 - Reflect changes in password file handling. yppwupdate: - Log map rebuilds to /var/yp/ypupdate.log. - Pass the name of the template password file to /var/yp/Makefile as $MASTER_PASSWD.
179 lines
4.8 KiB
C
179 lines
4.8 KiB
C
/*-
|
|
* Copyright (c) 1990, 1993, 1994
|
|
* The Regents of the University of California. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
* must display the following acknowledgement:
|
|
* This product includes software developed by the University of
|
|
* California, Berkeley and its contributors.
|
|
* 4. Neither the name of the University nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef lint
|
|
static char sccsid[] = "@(#)pw_util.c 8.3 (Berkeley) 4/2/94";
|
|
#endif /* not lint */
|
|
|
|
/*
|
|
* This file is used by all the "password" programs; vipw(8), chpass(1),
|
|
* and passwd(1).
|
|
*/
|
|
|
|
#include <sys/param.h>
|
|
#include <sys/time.h>
|
|
#include <sys/resource.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/wait.h>
|
|
|
|
#include <err.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <paths.h>
|
|
#include <pwd.h>
|
|
#include <signal.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <syslog.h>
|
|
|
|
#include <pw_util.h>
|
|
|
|
extern void reaper __P((int));
|
|
extern void install_reaper __P((int));
|
|
extern char *tempname;
|
|
extern char *passfile;
|
|
int pstat;
|
|
pid_t pid;
|
|
|
|
void
|
|
pw_init()
|
|
{
|
|
struct rlimit rlim;
|
|
|
|
/* Unlimited resource limits. */
|
|
rlim.rlim_cur = rlim.rlim_max = RLIM_INFINITY;
|
|
(void)setrlimit(RLIMIT_CPU, &rlim);
|
|
(void)setrlimit(RLIMIT_FSIZE, &rlim);
|
|
(void)setrlimit(RLIMIT_STACK, &rlim);
|
|
(void)setrlimit(RLIMIT_DATA, &rlim);
|
|
(void)setrlimit(RLIMIT_RSS, &rlim);
|
|
|
|
/* Don't drop core (not really necessary, but GP's). */
|
|
rlim.rlim_cur = rlim.rlim_max = 0;
|
|
(void)setrlimit(RLIMIT_CORE, &rlim);
|
|
|
|
/* Turn off signals. */
|
|
(void)signal(SIGALRM, SIG_IGN);
|
|
(void)signal(SIGHUP, SIG_IGN);
|
|
(void)signal(SIGINT, SIG_IGN);
|
|
(void)signal(SIGPIPE, SIG_IGN);
|
|
(void)signal(SIGQUIT, SIG_IGN);
|
|
(void)signal(SIGTSTP, SIG_IGN);
|
|
(void)signal(SIGTTOU, SIG_IGN);
|
|
|
|
/* Create with exact permissions. */
|
|
(void)umask(0);
|
|
}
|
|
|
|
static int lockfd;
|
|
|
|
int
|
|
pw_lock()
|
|
{
|
|
/*
|
|
* If the master password file doesn't exist, the system is hosed.
|
|
* Might as well try to build one. Set the close-on-exec bit so
|
|
* that users can't get at the encrypted passwords while editing.
|
|
* Open should allow flock'ing the file; see 4.4BSD. XXX
|
|
*/
|
|
lockfd = open(passfile, O_RDONLY, 0);
|
|
if (lockfd < 0 || fcntl(lockfd, F_SETFD, 1) == -1) {
|
|
syslog(LOG_NOTICE, "%s: %s", passfile, strerror(errno));
|
|
return (-1);
|
|
}
|
|
if (flock(lockfd, LOCK_EX|LOCK_NB)) {
|
|
syslog(LOG_NOTICE, "%s: the password db file is busy", passfile);
|
|
return(-1);
|
|
}
|
|
return (lockfd);
|
|
}
|
|
|
|
int
|
|
pw_tmp()
|
|
{
|
|
static char path[MAXPATHLEN];
|
|
int fd;
|
|
char *p;
|
|
|
|
sprintf(path,"%s",passfile);
|
|
if ((p = strrchr(path, '/')))
|
|
++p;
|
|
else
|
|
p = path;
|
|
strcpy(p, "pw.XXXXXX");
|
|
if ((fd = mkstemp(path)) == -1) {
|
|
syslog(LOG_ERR, "%s: %s", path, strerror(errno));
|
|
return(-1);
|
|
}
|
|
tempname = path;
|
|
return (fd);
|
|
}
|
|
|
|
int
|
|
pw_mkdb()
|
|
{
|
|
|
|
syslog(LOG_NOTICE, "rebuilding the database...");
|
|
(void)fflush(stderr);
|
|
/* Temporarily turn off SIGCHLD catching */
|
|
install_reaper(0);
|
|
if (!(pid = vfork())) {
|
|
execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", tempname, NULL);
|
|
pw_error(_PATH_PWD_MKDB, 1, 1);
|
|
return(-1);
|
|
}
|
|
/* Handle this ourselves. */
|
|
reaper(SIGCHLD);
|
|
/* Put the handler back. Foo. */
|
|
install_reaper(1);
|
|
if (pid == -1 || !WIFEXITED(pstat) || WEXITSTATUS(pstat) != 0) {
|
|
return (-1);
|
|
}
|
|
syslog(LOG_NOTICE, "done");
|
|
return (0);
|
|
}
|
|
|
|
void
|
|
pw_error(name, err, eval)
|
|
char *name;
|
|
int err, eval;
|
|
{
|
|
if (err && name != NULL)
|
|
syslog(LOG_ERR, "%s", name);
|
|
|
|
syslog(LOG_NOTICE,"%s: unchanged", passfile);
|
|
(void)unlink(tempname);
|
|
}
|