diff --git a/.hgignore b/.hgignore index 93d61940a..718d8872d 100644 --- a/.hgignore +++ b/.hgignore @@ -25,6 +25,7 @@ Makefile$ ^pathnames\.h$ ^src/sudo$ ^src/sesh$ +^src/check_ttyname$ ^src/sudo_usage\.h$ ^compat/mksiglist$ diff --git a/MANIFEST b/MANIFEST index 6ae6fd4d8..b92a2169e 100644 --- a/MANIFEST +++ b/MANIFEST @@ -242,7 +242,7 @@ plugins/sudoers/po/nl.mo plugins/sudoers/po/nl.po plugins/sudoers/po/pl.mo plugins/sudoers/po/pl.po -plugins/sudoers/po/sl.mo +plugins/sudoers/po/sl.mo plugins/sudoers/po/sl.po plugins/sudoers/po/sudoers.pot plugins/sudoers/po/sv.mo @@ -411,6 +411,7 @@ src/po/vi.po src/po/zh_CN.mo src/po/zh_CN.po src/preload.c +src/regress/ttyname/check_ttyname.c src/selinux.c src/sesh.c src/signal.c diff --git a/src/Makefile.in b/src/Makefile.in index 93fe043dc..efd435821 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -75,6 +75,10 @@ install_gid = 0 # File mode to use for shared libraries/objects shlib_mode = @SHLIB_MODE@ +TEST_PROGS = check_ttyname +TEST_LIBS = @LIBS@ @LIBINTL@ $(LT_LIBS) +TEST_LDFLAGS = @LDFLAGS@ + # OS dependent defines DEFS = @OSDEFS@ -DLOCALEDIR=\"$(localedir)\" @@ -90,6 +94,8 @@ OBJS = conversation.o env_hooks.o exec.o exec_common.o exec_pty.o get_pty.o \ SESH_OBJS = sesh.o locale_stub.o exec_common.o +CHECK_TTYNAME_OBJS = check_ttyname.o locale_stub.o ttyname.o + LIBOBJDIR = $(top_builddir)/@ac_config_libobj_dir@/ VERSION = @PACKAGE_VERSION@ @@ -116,6 +122,9 @@ libsudo_noexec.la: sudo_noexec.lo sesh: $(SESH_OBJS) @LIBINTL@ $(LT_LIBS) $(LIBTOOL) --mode=link $(CC) -o $@ $(SESH_OBJS) $(LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) @LIBINTL@ $(LIBS) +check_ttyname: $(CHECK_TTYNAME_OBJS) $(top_builddir)/common/libcommon.la $(LIBOBJDIR)libreplace.la + $(LIBTOOL) --mode=link $(CC) -o $@ $(CHECK_TTYNAME_OBJS) $(TEST_LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(TEST_LIBS) + pre-install: install: install-binaries @INSTALL_NOEXEC@ @@ -146,10 +155,11 @@ uninstall: $(DESTDIR)$(libexecdir)/sudo/sesh \ $(DESTDIR)$(noexecdir)/$(noexecfile) -check: +check: $(TEST_PROGS) + ./check_ttyname clean: - -$(LIBTOOL) --mode=clean rm -f $(PROGS) *.lo *.o *.la *.a stamp-* core *.core core.* + -$(LIBTOOL) --mode=clean rm -f $(PROGS) $(TEST_PROGS) *.lo *.o *.la *.a stamp-* core *.core core.* mostlyclean: clean @@ -164,6 +174,10 @@ realclean: distclean cleandir: realclean # Autogenerated dependencies, do not modify +check_ttyname.o: $(srcdir)/regress/ttyname/check_ttyname.c \ + $(top_builddir)/config.h $(incdir)/missing.h \ + $(incdir)/alloc.h $(incdir)/error.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/regress/ttyname/check_ttyname.c conversation.o: $(srcdir)/conversation.c $(top_builddir)/config.h \ $(srcdir)/sudo.h $(top_builddir)/pathnames.h \ $(top_srcdir)/compat/stdbool.h $(incdir)/missing.h \ diff --git a/src/regress/ttyname/check_ttyname.c b/src/regress/ttyname/check_ttyname.c new file mode 100644 index 000000000..1f2d0cc32 --- /dev/null +++ b/src/regress/ttyname/check_ttyname.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2013 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 +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif /* STDC_HEADERS */ +#ifdef HAVE_STRING_H +# if defined(HAVE_MEMORY_H) && !defined(STDC_HEADERS) +# include +# endif +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include + +#include "missing.h" +#include "alloc.h" +#include "error.h" + +__dso_public int main(int argc, char *argv[]); + +extern char *get_process_ttyname(void); + +int +main(int argc, char *argv[]) +{ + char *tty_libc, *tty_sudo; + int rval = 0; + +#if !defined(HAVE_GETPROGNAME) && !defined(HAVE___PROGNAME) + setprogname(argc > 0 ? argv[0] : "check_ttyname"); +#endif + + /* Lookup tty name via libc. */ + if ((tty_libc = ttyname(STDIN_FILENO)) == NULL || + (tty_libc = ttyname(STDOUT_FILENO)) == NULL || + (tty_libc = ttyname(STDERR_FILENO)) == NULL) + tty_libc = "none"; + tty_libc = estrdup(tty_libc); + + /* Lookup tty name via sudo (using kernel info if possible). */ + if ((tty_sudo = get_process_ttyname()) == NULL) + tty_sudo = estrdup("none"); + + if (strcmp(tty_libc, tty_sudo) == 0) { + printf("%s: OK (%s)\n", getprogname(), tty_sudo); + } else { + printf("%s: FAIL %s (sudo) vs. %s (libc)\n", getprogname(), + tty_sudo, tty_libc); + rval = 1; + } + + efree(tty_libc); + efree(tty_sudo); + exit(rval); +}