diff --git a/MANIFEST b/MANIFEST index 7d80d08da..1b6685c88 100644 --- a/MANIFEST +++ b/MANIFEST @@ -119,8 +119,9 @@ lib/iolog/iolog_fileio.c lib/iolog/iolog_json.c lib/iolog/iolog_json.h lib/iolog/iolog_legacy.c +lib/iolog/iolog_loginfo.c lib/iolog/iolog_path.c -lib/iolog/iolog_util.c +lib/iolog/iolog_timing.c lib/iolog/regress/corpus/log_json/id.json lib/iolog/regress/corpus/log_json/ls.json lib/iolog/regress/corpus/log_json/mailq.json @@ -152,7 +153,7 @@ lib/iolog/regress/iolog_json/test3.in lib/iolog/regress/iolog_mkpath/check_iolog_mkpath.c lib/iolog/regress/iolog_path/check_iolog_path.c lib/iolog/regress/iolog_path/data -lib/iolog/regress/iolog_util/check_iolog_util.c +lib/iolog/regress/iolog_timing/check_iolog_timing.c lib/logsrv/Makefile.in lib/logsrv/log_server.pb-c.c lib/logsrv/log_server.proto diff --git a/lib/iolog/Makefile.in b/lib/iolog/Makefile.in index 70eb38699..951365c72 100644 --- a/lib/iolog/Makefile.in +++ b/lib/iolog/Makefile.in @@ -76,7 +76,7 @@ PVS_IGNORE = 'V707,V011,V002,V536' PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE) # Regression tests -TEST_PROGS = check_iolog_json check_iolog_mkpath check_iolog_path check_iolog_util host_port_test +TEST_PROGS = check_iolog_json check_iolog_mkpath check_iolog_path check_iolog_timing host_port_test TEST_LIBS = @LIBS@ TEST_LDFLAGS = @LDFLAGS@ @@ -95,8 +95,8 @@ DEVEL = @DEVEL@ SHELL = @SHELL@ -LIBIOLOG_OBJS = iolog_fileio.lo iolog_json.lo iolog_legacy.lo iolog_path.lo \ - iolog_util.lo host_port.lo hostcheck.lo +LIBIOLOG_OBJS = iolog_fileio.lo iolog_json.lo iolog_legacy.lo iolog_loginfo.lo \ + iolog_path.lo iolog_timing.lo host_port.lo hostcheck.lo IOBJS = $(LIBIOLOG_OBJS:.lo=.i) @@ -106,7 +106,7 @@ CHECK_IOLOG_MKPATH_OBJS = check_iolog_mkpath.lo iolog_fileio.lo CHECK_IOLOG_PATH_OBJS = check_iolog_path.lo iolog_path.lo -CHECK_IOLOG_UTIL_OBJS = check_iolog_util.lo iolog_json.lo iolog_util.lo +CHECK_IOLOG_TIMING_OBJS = check_iolog_timing.lo iolog_json.lo iolog_timing.lo CHECK_IOLOG_JSON_OBJS = check_iolog_json.lo iolog_json.lo @@ -159,8 +159,8 @@ check_iolog_path: $(CHECK_IOLOG_PATH_OBJS) libsudo_iolog.la check_iolog_mkpath: $(CHECK_IOLOG_MKPATH_OBJS) libsudo_iolog.la $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_IOLOG_MKPATH_OBJS) libsudo_iolog.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS) -check_iolog_util: $(CHECK_IOLOG_UTIL_OBJS) libsudo_iolog.la - $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_IOLOG_UTIL_OBJS) libsudo_iolog.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS) +check_iolog_timing: $(CHECK_IOLOG_TIMING_OBJS) libsudo_iolog.la + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_IOLOG_TIMING_OBJS) libsudo_iolog.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS) check_iolog_json: $(CHECK_IOLOG_JSON_OBJS) libsudo_iolog.la $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_IOLOG_JSON_OBJS) libsudo_iolog.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS) @@ -256,7 +256,7 @@ check: $(TEST_PROGS) fuzz ./check_iolog_json $(srcdir)/regress/iolog_json/*.in || rval=`expr $$rval + $$?`; \ ./check_iolog_path $(srcdir)/regress/iolog_path/data || rval=`expr $$rval + $$?`; \ ./check_iolog_mkpath || rval=`expr $$rval + $$?`; \ - ./check_iolog_util || rval=`expr $$rval + $$?`; \ + ./check_iolog_timing || rval=`expr $$rval + $$?`; \ ./host_port_test || rval=`expr $$rval + $$?`; \ exit $$rval; \ fi @@ -325,20 +325,20 @@ check_iolog_path.i: $(srcdir)/regress/iolog_path/check_iolog_path.c \ $(CC) -E -o $@ $(CPPFLAGS) $< check_iolog_path.plog: check_iolog_path.i rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iolog_path/check_iolog_path.c --i-file $< --output-file $@ -check_iolog_util.lo: $(srcdir)/regress/iolog_util/check_iolog_util.c \ - $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ - $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \ - $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \ - $(top_builddir)/config.h - $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/iolog_util/check_iolog_util.c -check_iolog_util.i: $(srcdir)/regress/iolog_util/check_iolog_util.c \ - $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ - $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \ - $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \ - $(top_builddir)/config.h +check_iolog_timing.lo: $(srcdir)/regress/iolog_timing/check_iolog_timing.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/iolog_timing/check_iolog_timing.c +check_iolog_timing.i: $(srcdir)/regress/iolog_timing/check_iolog_timing.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h $(CC) -E -o $@ $(CPPFLAGS) $< -check_iolog_util.plog: check_iolog_util.i - rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iolog_util/check_iolog_util.c --i-file $< --output-file $@ +check_iolog_timing.plog: check_iolog_timing.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iolog_timing/check_iolog_timing.c --i-file $< --output-file $@ fuzz_iolog_json.lo: $(srcdir)/regress/fuzz/fuzz_iolog_json.c \ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \ @@ -477,6 +477,22 @@ iolog_legacy.i: $(srcdir)/iolog_legacy.c $(incdir)/compat/stdbool.h \ $(CC) -E -o $@ $(CPPFLAGS) $< iolog_legacy.plog: iolog_legacy.i rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_legacy.c --i-file $< --output-file $@ +iolog_loginfo.lo: $(srcdir)/iolog_loginfo.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/iolog_loginfo.c +iolog_loginfo.i: $(srcdir)/iolog_loginfo.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +iolog_loginfo.plog: iolog_loginfo.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_loginfo.c --i-file $< --output-file $@ iolog_path.lo: $(srcdir)/iolog_path.c $(incdir)/compat/stdbool.h \ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ @@ -493,19 +509,19 @@ iolog_path.i: $(srcdir)/iolog_path.c $(incdir)/compat/stdbool.h \ $(CC) -E -o $@ $(CPPFLAGS) $< iolog_path.plog: iolog_path.i rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_path.c --i-file $< --output-file $@ -iolog_util.lo: $(srcdir)/iolog_util.c $(incdir)/compat/stdbool.h \ - $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ - $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ - $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \ - $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ - $(incdir)/sudo_util.h $(top_builddir)/config.h - $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/iolog_util.c -iolog_util.i: $(srcdir)/iolog_util.c $(incdir)/compat/stdbool.h \ - $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ - $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ - $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \ - $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ - $(incdir)/sudo_util.h $(top_builddir)/config.h +iolog_timing.lo: $(srcdir)/iolog_timing.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/iolog_timing.c +iolog_timing.i: $(srcdir)/iolog_timing.c $(incdir)/compat/stdbool.h \ + $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h $(CC) -E -o $@ $(CPPFLAGS) $< -iolog_util.plog: iolog_util.i - rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_util.c --i-file $< --output-file $@ +iolog_timing.plog: iolog_timing.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_timing.c --i-file $< --output-file $@ diff --git a/lib/iolog/iolog_loginfo.c b/lib/iolog/iolog_loginfo.c new file mode 100644 index 000000000..203dd18c7 --- /dev/null +++ b/lib/iolog/iolog_loginfo.c @@ -0,0 +1,95 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2009-2020 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is an open source non-commercial project. Dear PVS-Studio, please check it. + * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + */ + +#include + +#include +#include +#ifdef HAVE_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif /* HAVE_STDBOOL_H */ +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_debug.h" +#include "sudo_eventlog.h" +#include "sudo_fatal.h" +#include "sudo_gettext.h" +#include "sudo_iolog.h" +#include "sudo_util.h" + +struct eventlog * +iolog_parse_loginfo(int dfd, const char *iolog_dir) +{ + struct eventlog *evlog = NULL; + FILE *fp = NULL; + int fd = -1; + int tmpfd = -1; + bool ok, legacy = false; + debug_decl(iolog_parse_loginfo, SUDO_DEBUG_UTIL); + + if (dfd == -1) { + if ((tmpfd = open(iolog_dir, O_RDONLY)) == -1) { + sudo_warn("%s", iolog_dir); + goto bad; + } + dfd = tmpfd; + } + if ((fd = openat(dfd, "log.json", O_RDONLY, 0)) == -1) { + fd = openat(dfd, "log", O_RDONLY, 0); + legacy = true; + } + if (tmpfd != -1) + close(tmpfd); + if (fd == -1 || (fp = fdopen(fd, "r")) == NULL) { + sudo_warn("%s/log", iolog_dir); + goto bad; + } + fd = -1; + + if ((evlog = calloc(1, sizeof(*evlog))) == NULL) { + sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); + goto bad; + } + evlog->runuid = (uid_t)-1; + evlog->rungid = (gid_t)-1; + + ok = legacy ? iolog_parse_loginfo_legacy(fp, iolog_dir, evlog) : + iolog_parse_loginfo_json(fp, iolog_dir, evlog); + if (ok) { + fclose(fp); + debug_return_ptr(evlog); + } + +bad: + if (fd != -1) + close(fd); + if (fp != NULL) + fclose(fp); + eventlog_free(evlog); + debug_return_ptr(NULL); +} diff --git a/lib/iolog/iolog_util.c b/lib/iolog/iolog_timing.c similarity index 86% rename from lib/iolog/iolog_util.c rename to lib/iolog/iolog_timing.c index 59313ec17..b7375050c 100644 --- a/lib/iolog/iolog_util.c +++ b/lib/iolog/iolog_timing.c @@ -49,58 +49,6 @@ static int timing_event_adj; -struct eventlog * -iolog_parse_loginfo(int dfd, const char *iolog_dir) -{ - struct eventlog *evlog = NULL; - FILE *fp = NULL; - int fd = -1; - int tmpfd = -1; - bool ok, legacy = false; - debug_decl(iolog_parse_loginfo, SUDO_DEBUG_UTIL); - - if (dfd == -1) { - if ((tmpfd = open(iolog_dir, O_RDONLY)) == -1) { - sudo_warn("%s", iolog_dir); - goto bad; - } - dfd = tmpfd; - } - if ((fd = openat(dfd, "log.json", O_RDONLY, 0)) == -1) { - fd = openat(dfd, "log", O_RDONLY, 0); - legacy = true; - } - if (tmpfd != -1) - close(tmpfd); - if (fd == -1 || (fp = fdopen(fd, "r")) == NULL) { - sudo_warn("%s/log", iolog_dir); - goto bad; - } - fd = -1; - - if ((evlog = calloc(1, sizeof(*evlog))) == NULL) { - sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); - goto bad; - } - evlog->runuid = (uid_t)-1; - evlog->rungid = (gid_t)-1; - - ok = legacy ? iolog_parse_loginfo_legacy(fp, iolog_dir, evlog) : - iolog_parse_loginfo_json(fp, iolog_dir, evlog); - if (ok) { - fclose(fp); - debug_return_ptr(evlog); - } - -bad: - if (fd != -1) - close(fd); - if (fp != NULL) - fclose(fp); - eventlog_free(evlog); - debug_return_ptr(NULL); -} - void iolog_adjust_delay(struct timespec *delay, struct timespec *max_delay, double scale_factor) diff --git a/lib/iolog/regress/iolog_util/check_iolog_util.c b/lib/iolog/regress/iolog_timing/check_iolog_timing.c similarity index 97% rename from lib/iolog/regress/iolog_util/check_iolog_util.c rename to lib/iolog/regress/iolog_timing/check_iolog_timing.c index de94ee17e..89fc45db3 100644 --- a/lib/iolog/regress/iolog_util/check_iolog_util.c +++ b/lib/iolog/regress/iolog_timing/check_iolog_timing.c @@ -132,14 +132,14 @@ main(int argc, char *argv[]) { int tests = 0, errors = 0; - initprogname(argc > 0 ? argv[0] : "check_iolog_util"); + initprogname(argc > 0 ? argv[0] : "check_iolog_timing"); test_parse_delay(&tests, &errors); test_adjust_delay(&tests, &errors); if (tests != 0) { - printf("iolog_util: %d test%s run, %d errors, %d%% success rate\n", + printf("iolog_timing: %d test%s run, %d errors, %d%% success rate\n", tests, tests == 1 ? "" : "s", errors, (tests - errors) * 100 / tests); }