diff --git a/MANIFEST b/MANIFEST index 04fa7f7ff..7eb11f39e 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1103,6 +1103,7 @@ src/openbsd.c src/parse_args.c src/preload.c src/preserve_fds.c +src/regress/net_ifs/check_net_ifs.c src/regress/noexec/check_noexec.c src/regress/ttyname/check_ttyname.c src/selinux.c diff --git a/src/Makefile.in b/src/Makefile.in index 80574f674..0f5f216e3 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -113,7 +113,7 @@ INIT_DIR=@INIT_DIR@ INIT_SCRIPT=@INIT_SCRIPT@ RC_LINK=@RC_LINK@ -TEST_PROGS = check_ttyname @CHECK_NOEXEC@ +TEST_PROGS = check_net_ifs @CHECK_NOEXEC@ check_ttyname TEST_LIBS = @LIBS@ $(LT_LIBS) TEST_LDFLAGS = @LDFLAGS@ @@ -135,6 +135,8 @@ POBJS = $(IOBJS:.i=.plog) SESH_OBJS = copy_file.o edit_open.o exec_common.o sesh.o +CHECK_NET_IFS_OBJS = check_net_ifs.o net_ifs.o + CHECK_NOEXEC_OBJS = check_noexec.o exec_common.o CHECK_TTYNAME_OBJS = check_ttyname.o ttyname.o @@ -186,6 +188,9 @@ sudo_noexec.la: libsudo_noexec.la sesh: $(SESH_OBJS) $(LT_LIBS) $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(SESH_OBJS) $(LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) +check_net_ifs: $(CHECK_NET_IFS_OBJS) $(top_builddir)/lib/util/libsudo_util.la + $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_NET_IFS_OBJS) $(TEST_LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(TEST_LIBS) + check_noexec: $(CHECK_NOEXEC_OBJS) $(top_builddir)/lib/util/libsudo_util.la sudo_noexec.la $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_NOEXEC_OBJS) $(TEST_LDFLAGS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(TEST_LIBS) @@ -279,10 +284,11 @@ check: $(TEST_PROGS) check-fuzzer unset LANG || LANG=; \ MALLOC_OPTIONS=S; export MALLOC_OPTIONS; \ MALLOC_CONF="abort:true,junk:true"; export MALLOC_CONF; \ - ./check_ttyname; \ + ./check_net_ifs; \ if test X"@CHECK_NOEXEC@" != X""; then \ ./check_noexec .libs/$(noexecfile); \ fi; \ + ./check_ttyname; \ fi clean: @@ -310,6 +316,20 @@ sudo_noexec.lo: $(srcdir)/sudo_noexec.c $(incdir)/sudo_compat.h \ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/sudo_noexec.c # Autogenerated dependencies, do not modify +check_net_ifs.o: $(srcdir)/regress/net_ifs/check_net_ifs.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/net_ifs/check_net_ifs.c +check_net_ifs.i: $(srcdir)/regress/net_ifs/check_net_ifs.c \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_debug.h $(incdir)/sudo_fatal.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(top_builddir)/config.h + $(CC) -E -o $@ $(CPPFLAGS) $< +check_net_ifs.plog: check_net_ifs.i + rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/net_ifs/check_net_ifs.c --i-file $< --output-file $@ check_noexec.o: $(srcdir)/regress/noexec/check_noexec.c \ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ $(incdir)/sudo_fatal.h $(incdir)/sudo_plugin.h \ diff --git a/src/regress/net_ifs/check_net_ifs.c b/src/regress/net_ifs/check_net_ifs.c new file mode 100644 index 000000000..fbeb35819 --- /dev/null +++ b/src/regress/net_ifs/check_net_ifs.c @@ -0,0 +1,62 @@ +/* + * SPDX-License-Identifier: ISC + * + * Copyright (c) 2021 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. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sudo_compat.h" +#include "sudo_fatal.h" +#include "sudo_util.h" + +sudo_dso_public int main(int argc, char *argv[]); + +extern int get_net_ifs(char **addrinfo); + +int +main(int argc, char *argv[]) +{ + char *interfaces; + int ninterfaces; + + initprogname(argc > 0 ? argv[0] : "check_net_ifs"); + + ninterfaces = get_net_ifs(&interfaces); + switch (ninterfaces) { + case -1: + sudo_warn_nodebug("unable to get network interfaces"); + return 1; + case 0: + /* no interfaces or STUB_LOAD_INTERFACES defined. */ + sudo_warnx_nodebug("OK: (0 interfaces)"); + break; + default: + sudo_warnx_nodebug("OK: (%d interface%s, %s)", ninterfaces, + ninterfaces > 1 ? "s" : "", interfaces); + break; + } + + return 0; +}