diff --git a/MANIFEST b/MANIFEST index 80c25a838..14aaab28a 100644 --- a/MANIFEST +++ b/MANIFEST @@ -23,6 +23,7 @@ common/fmt_string.c common/gidlist.c common/lbuf.c common/progname.c +common/regress/atofoo/atofoo_test.c common/regress/sudo_conf/conf_test.c common/regress/sudo_conf/test1.in common/regress/sudo_conf/test1.out.ok diff --git a/common/Makefile.in b/common/Makefile.in index 1884024f1..d886dfe63 100644 --- a/common/Makefile.in +++ b/common/Makefile.in @@ -58,7 +58,7 @@ SSP_LDFLAGS = @SSP_LDFLAGS@ CPPCHECK_OPTS = -q --force --enable=warning,performance,portability --suppress=constStatement --error-exitcode=1 --inline-suppr -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX # Regression tests -TEST_PROGS = conf_test parseln_test hltq_test +TEST_PROGS = atofoo_test conf_test hltq_test parseln_test TEST_LIBS = @LIBS@ @LIBINTL@ ../compat/libreplace.la TEST_LDFLAGS = @LDFLAGS@ @@ -74,6 +74,8 @@ LTOBJS = alloc.lo atobool.lo atoid.lo atomode.lo event.lo fatal.lo fileops.lo \ setgroups.lo sudo_conf.lo sudo_debug.lo sudo_dso.lo sudo_printf.lo \ term.lo ttysize.lo @COMMON_OBJS@ +ATOFOO_TEST_OBJS = atofoo_test.lo locale_stub.lo + PARSELN_TEST_OBJS = parseln_test.lo locale_stub.lo CONF_TEST_OBJS = conf_test.lo locale_stub.lo @@ -93,6 +95,9 @@ Makefile: $(srcdir)/Makefile.in libsudo_util.la: $(LTOBJS) $(LIBTOOL) --mode=link $(CC) -o $@ $(LTOBJS) -no-install +atofoo_test: $(ATOFOO_TEST_OBJS) libsudo_util.la + $(LIBTOOL) --mode=link $(CC) -o $@ $(ATOFOO_TEST_OBJS) libsudo_util.la $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS) + conf_test: $(CONF_TEST_OBJS) libsudo_util.la $(LIBTOOL) --mode=link $(CC) -o $@ $(CONF_TEST_OBJS) libsudo_util.la $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS) @@ -125,6 +130,11 @@ check: $(TEST_PROGS) @if test X"$(cross_compiling)" != X"yes"; then \ passed=0; failed=0; total=0; \ total=1; \ + if ./atofoo_test; then \ + passed=`expr $$passed + 1`; \ + else \ + failed=`expr $$failed + 1`; \ + fi; \ if ./hltq_test; then \ passed=`expr $$passed + 1`; \ else \ @@ -183,6 +193,10 @@ atobool.lo: $(srcdir)/atobool.c $(incdir)/missing.h $(incdir)/sudo_debug.h \ $(incdir)/sudo_util.h $(top_builddir)/config.h \ $(top_srcdir)/compat/stdbool.h $(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/atobool.c +atofoo_test.lo: $(srcdir)/regress/atofoo/atofoo_test.c $(incdir)/fatal.h \ + $(incdir)/missing.h $(incdir)/sudo_util.h \ + $(top_builddir)/config.h $(top_srcdir)/compat/stdbool.h + $(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/regress/atofoo/atofoo_test.c atoid.lo: $(srcdir)/atoid.c $(incdir)/gettext.h $(incdir)/missing.h \ $(incdir)/sudo_debug.h $(incdir)/sudo_util.h \ $(top_builddir)/config.h $(top_srcdir)/compat/stdbool.h diff --git a/common/regress/atofoo/atofoo_test.c b/common/regress/atofoo/atofoo_test.c new file mode 100644 index 000000000..852822969 --- /dev/null +++ b/common/regress/atofoo/atofoo_test.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2014 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_STDBOOL_H +# include +#else +# include "compat/stdbool.h" +#endif + +#include "missing.h" +#include "sudo_util.h" +#include "fatal.h" + +__dso_public int main(int argc, char *argv[]); + +/* atobool() tests */ +static struct atobool_data { + const char *bool_str; + int value; +} atobool_data[] = { + { "true", true }, + { "false", false }, + { "TrUe", true }, + { "fAlSe", false }, + { "1", true }, + { "0", false }, + { "on", true }, + { "off", false }, + { "yes", true }, + { "no", false }, + { "nope", -1 }, + { "10", -1 }, + { "one", -1 }, + { "zero", -1 }, + { NULL, 0 } +}; + +static int +test_atobool(void) +{ + struct atobool_data *d; + int errors = 0; + int value; + + for (d = atobool_data; d->bool_str != NULL; d++) { + value = atobool(d->bool_str); + if (value != d->value) { + warningx_nodebug("FAIL: %s != %d", d->bool_str, d->value); + errors++; + } + } + + return errors; +} + +/* atoid() tests */ +static struct atoid_data { + const char *idstr; + id_t id; + const char *sep; + const char *ep; +} atoid_data[] = { + { "0,1", 0, ",", "," }, + { "10", 10, NULL, NULL }, + { "-2", -2, NULL, NULL }, + { "-2", 4294967294, NULL, NULL }, + { "4294967294", 4294967294, NULL, NULL }, + { NULL, 0, NULL, NULL } +}; + +static int +test_atoid(void) +{ + struct atoid_data *d; + const char *errstr; + char *ep; + int errors = 0; + id_t value; + + for (d = atoid_data; d->idstr != NULL; d++) { + errstr = "some error"; + value = atoid(d->idstr, d->sep, &ep, &errstr); + if (errstr != NULL) { + if (d->id != (id_t)-1) { + warningx_nodebug("FAIL: %s: %s", d->idstr, errstr); + errors++; + } + } else if (value != d->id) { + warningx_nodebug("FAIL: %s != %u", d->idstr, (unsigned int)d->id); + errors++; + } else if (d->ep != NULL && ep[0] != d->ep[0]) { + warningx_nodebug("FAIL: ep[0] %d != %d", (int)(unsigned char)ep[0], + (int)(unsigned char)d->ep[0]); + errors++; + } + } + + return errors; +} + +/* atomode() tests */ +static struct atomode_data { + const char *mode_str; + mode_t mode; +} atomode_data[] = { + { "755", 0755 }, + { "007", 007 }, + { "7", 7 }, + { "8", -1 }, + { NULL, 0 } +}; + +static int +test_atomode(void) +{ + struct atomode_data *d; + const char *errstr; + int errors = 0; + mode_t mode; + + for (d = atomode_data; d->mode_str != NULL; d++) { + errstr = "some error"; + mode = atomode(d->mode_str, &errstr); + if (errstr != NULL) { + if (d->mode != (mode_t)-1) { + warningx_nodebug("FAIL: %s: %s", d->mode_str, errstr); + errors++; + } + } else if (mode != d->mode) { + warningx_nodebug("FAIL: %s != 0%o", d->mode_str, d->mode); + errors++; + } + } + + return errors; +} + +/* + * Simple tests for atobool(), atoid(), atomode(). + */ +int +main(int argc, char *argv[]) +{ + int errors = 0; + + errors += test_atobool(); + errors += test_atoid(); + errors += test_atomode(); + + exit(errors); +}