Lock the log file.
This commit is contained in:
@@ -286,6 +286,12 @@
|
|||||||
/* Define if you have strerror(3). */
|
/* Define if you have strerror(3). */
|
||||||
#undef HAVE_STRERROR
|
#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). */
|
/* Define if you have snprintf(3). */
|
||||||
#undef HAVE_SNPRINTF
|
#undef HAVE_SNPRINTF
|
||||||
|
|
||||||
|
@@ -1358,6 +1358,7 @@ fi
|
|||||||
if test -z "$BROKEN_GETCWD"; then
|
if test -z "$BROKEN_GETCWD"; then
|
||||||
AC_CHECK_FUNC(getcwd, AC_DEFINE(HAVE_GETCWD), LIBOBJS="$LIBOBJS getcwd.o")
|
AC_CHECK_FUNC(getcwd, AC_DEFINE(HAVE_GETCWD), LIBOBJS="$LIBOBJS getcwd.o")
|
||||||
fi
|
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(waitpid, AC_DEFINE(HAVE_WAITPID), AC_CHECK_FUNCS(wait3))
|
||||||
AC_CHECK_FUNC(innetgr, AC_DEFINE(HAVE_INNETGR) AC_CHECK_FUNCS(getdomainname))
|
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"))
|
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"))
|
||||||
|
46
logging.c
46
logging.c
@@ -47,6 +47,7 @@
|
|||||||
#ifdef HAVE_STRINGS_H
|
#ifdef HAVE_STRINGS_H
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#endif /* HAVE_STRINGS_H */
|
#endif /* HAVE_STRINGS_H */
|
||||||
|
#include <fcntl.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
@@ -67,6 +68,7 @@ static void do_syslog __P((int, char *));
|
|||||||
#endif
|
#endif
|
||||||
#if (LOGGING & SLOG_FILE)
|
#if (LOGGING & SLOG_FILE)
|
||||||
static void do_logfile __P((char *));
|
static void do_logfile __P((char *));
|
||||||
|
static int lock_file __P((FILE *, int));
|
||||||
#endif
|
#endif
|
||||||
static void send_mail __P((char *));
|
static void send_mail __P((char *));
|
||||||
|
|
||||||
@@ -170,7 +172,6 @@ do_logfile(msg)
|
|||||||
set_perms(PERM_ROOT, 0);
|
set_perms(PERM_ROOT, 0);
|
||||||
|
|
||||||
oldmask = umask(077);
|
oldmask = umask(077);
|
||||||
/* XXX - lock log file */
|
|
||||||
fp = fopen(_PATH_SUDO_LOGFILE, "a");
|
fp = fopen(_PATH_SUDO_LOGFILE, "a");
|
||||||
(void) umask(oldmask);
|
(void) umask(oldmask);
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
@@ -178,6 +179,11 @@ do_logfile(msg)
|
|||||||
_PATH_SUDO_LOGFILE, strerror(errno));
|
_PATH_SUDO_LOGFILE, strerror(errno));
|
||||||
send_mail(full_line);
|
send_mail(full_line);
|
||||||
free(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 {
|
} else {
|
||||||
# ifndef WRAP_LOG
|
# ifndef WRAP_LOG
|
||||||
# ifdef HOST_IN_LOG
|
# ifdef HOST_IN_LOG
|
||||||
@@ -245,6 +251,8 @@ do_logfile(msg)
|
|||||||
}
|
}
|
||||||
free(full_line);
|
free(full_line);
|
||||||
# endif
|
# endif
|
||||||
|
(void) fflush(fp);
|
||||||
|
(void) lock_file(fp, FALSE);
|
||||||
(void) fclose(fp);
|
(void) fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -564,3 +572,39 @@ reapchild(sig)
|
|||||||
#endif /* POSIX_SIGNALS */
|
#endif /* POSIX_SIGNALS */
|
||||||
errno = serrno;
|
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
|
||||||
|
Reference in New Issue
Block a user