Lock the log file.

This commit is contained in:
Todd C. Miller
1999-08-06 13:33:03 +00:00
parent 145992dce2
commit 925f4eabc2
4 changed files with 303 additions and 146 deletions

View File

@@ -286,6 +286,12 @@
/* Define if you have strerror(3). */
#undef HAVE_STRERROR
/* Define if you have lockf(3). */
#undef HAVE_LOCKF
/* Define if you have flock(2). */
#undef HAVE_FLOCK
/* Define if you have snprintf(3). */
#undef HAVE_SNPRINTF

396
configure vendored

File diff suppressed because it is too large Load Diff

View File

@@ -1358,6 +1358,7 @@ fi
if test -z "$BROKEN_GETCWD"; then
AC_CHECK_FUNC(getcwd, AC_DEFINE(HAVE_GETCWD), LIBOBJS="$LIBOBJS getcwd.o")
fi
AC_CHECK_FUNC(lockf, AC_DEFINE(HAVE_LOCKF), AC_CHECK_FUNCS(flock))
AC_CHECK_FUNC(waitpid, AC_DEFINE(HAVE_WAITPID), AC_CHECK_FUNCS(wait3))
AC_CHECK_FUNC(innetgr, AC_DEFINE(HAVE_INNETGR) AC_CHECK_FUNCS(getdomainname))
AC_CHECK_FUNC(lsearch, AC_DEFINE(HAVE_LSEARCH), AC_CHECK_LIB(compat, lsearch, AC_CHECK_HEADER(search.h, AC_DEFINE(HAVE_LSEARCH) [SUDO_LIBS="${SUDO_LIBS} -lcompat"; VISUDO_LIBS="${VISUDO_LIBS} -lcompat"; LIBS="${LIBS} -lcompat"], LIBOBJS="$LIBOBJS lsearch.o"), LIBOBJS="$LIBOBJS lsearch.o"))

View File

@@ -47,6 +47,7 @@
#ifdef HAVE_STRINGS_H
#include <strings.h>
#endif /* HAVE_STRINGS_H */
#include <fcntl.h>
#include <pwd.h>
#include <signal.h>
#include <time.h>
@@ -67,6 +68,7 @@ static void do_syslog __P((int, char *));
#endif
#if (LOGGING & SLOG_FILE)
static void do_logfile __P((char *));
static int lock_file __P((FILE *, int));
#endif
static void send_mail __P((char *));
@@ -170,7 +172,6 @@ do_logfile(msg)
set_perms(PERM_ROOT, 0);
oldmask = umask(077);
/* XXX - lock log file */
fp = fopen(_PATH_SUDO_LOGFILE, "a");
(void) umask(oldmask);
if (fp == NULL) {
@@ -178,6 +179,11 @@ do_logfile(msg)
_PATH_SUDO_LOGFILE, strerror(errno));
send_mail(full_line);
free(full_line);
} else if (!lock_file(fp, TRUE)) {
easprintf(&full_line, "Can't lock log file: %s: %s",
_PATH_SUDO_LOGFILE, strerror(errno));
send_mail(full_line);
free(full_line);
} else {
# ifndef WRAP_LOG
# ifdef HOST_IN_LOG
@@ -245,6 +251,8 @@ do_logfile(msg)
}
free(full_line);
# endif
(void) fflush(fp);
(void) lock_file(fp, FALSE);
(void) fclose(fp);
}
@@ -564,3 +572,39 @@ reapchild(sig)
#endif /* POSIX_SIGNALS */
errno = serrno;
}
/*
* Lock/unlock a file.
*/
#ifdef HAVE_LOCKF
static int
lock_file(fp, lockit)
FILE *fp;
int lockit;
{
int op;
op = lockit ? F_LOCK : F_ULOCK;
return(lockf(fileno(fp), op, 0) == 0);
}
#elif HAVE_FLOCK
static int
lock_file(fp, lockit)
FILE *fp;
int lockit;
{
int op;
op = lockit ? LOCK_EX : LOCK_UN;
return(flock(fileno(fp), op) == 0);
}
#else
static int
lock_file(fp, lockit)
FILE *fp;
int lockit;
{
/* XXX - implement fcntl-style locking */
return(TRUE);
}
#endif