]> eyrie.org Git - kerberos/pam-krb5.git/commitdiff
Update to rra-c-util 9.0 and C TAP Harness 4.7
authorRuss Allbery <rra@debian.org>
Mon, 15 Mar 2021 04:51:36 +0000 (21:51 -0700)
committerRuss Allbery <rra@debian.org>
Mon, 15 Mar 2021 04:51:36 +0000 (21:51 -0700)
Update to rra-c-util 9.0:

* Check that at least one Kerberos header file was found and works.
* Use AS_ECHO in all Autoconf macros in preference to echo.
* Fix portability of reallocarray on NetBSD systems.
* Stop providing a replacement for a broken snprintf.

Update to C TAP Harness 4.7:

* Fix warnings with GCC 10.

22 files changed:
Makefile.am
NEWS
configure.ac
m4/cc-flags.m4
m4/krb5-config.m4
m4/krb5.m4
m4/lib-pathname.m4
m4/pam-const.m4
m4/snprintf.m4 [deleted file]
portable/snprintf.c [deleted file]
portable/system.h
tests/TESTS
tests/data/cppcheck.supp
tests/data/valgrind.supp
tests/docs/spdx-license-t
tests/portable/snprintf-t.c [deleted file]
tests/portable/snprintf.c [deleted file]
tests/runtests.c
tests/style/obsolete-strings-t
tests/tap/perl/Test/RRA.pm
tests/tap/perl/Test/RRA/Automake.pm
tests/tap/perl/Test/RRA/Config.pm

index 564dc82d370e3bfc9e326b1653c4ad0c67308b10..7f874afd69ea3cc25615bd9a339b14366f405a8a 100644 (file)
@@ -1,7 +1,7 @@
 # Automake makefile for pam-krb5.
 #
 # Written by Russ Allbery <eagle@eyrie.org>
-# Copyright 2005-2007, 2014, 2017, 2020 Russ Allbery <eagle@eyrie.org>
+# Copyright 2005-2007, 2014, 2017, 2020-2021 Russ Allbery <eagle@eyrie.org>
 # Copyright 2009, 2011-2012
 #     The Board of Trustees of the Leland Stanford Junior University
 # Copyright 2005 Andres Salomon <dilinger@debian.org>
@@ -85,7 +85,7 @@ check_PROGRAMS = tests/runtests tests/module/alt-auth-t                           \
        tests/pam-util/fakepam-t tests/pam-util/logging-t                   \
        tests/pam-util/options-t tests/pam-util/vector-t                    \
        tests/portable/asprintf-t tests/portable/mkstemp-t                  \
-       tests/portable/snprintf-t tests/portable/strndup-t
+       tests/portable/strndup-t
 tests_runtests_CPPFLAGS = -DC_TAP_SOURCE='"$(abs_top_srcdir)/tests"' \
        -DC_TAP_BUILD='"$(abs_top_builddir)/tests"'
 check_LIBRARIES = tests/fakepam/libfakepam.a tests/tap/libtap.a
@@ -162,9 +162,6 @@ tests_portable_asprintf_t_LDADD = tests/tap/libtap.a portable/libportable.la
 tests_portable_mkstemp_t_SOURCES = tests/portable/mkstemp-t.c \
        tests/portable/mkstemp.c
 tests_portable_mkstemp_t_LDADD = tests/tap/libtap.a portable/libportable.la
-tests_portable_snprintf_t_SOURCES = tests/portable/snprintf-t.c \
-       tests/portable/snprintf.c
-tests_portable_snprintf_t_LDADD = tests/tap/libtap.a portable/libportable.la
 tests_portable_strndup_t_SOURCES = tests/portable/strndup-t.c \
        tests/portable/strndup.c
 tests_portable_strndup_t_LDADD = tests/tap/libtap.a portable/libportable.la
@@ -199,5 +196,5 @@ check-valgrind: $(check_PROGRAMS)
 # Used by maintainers to reformat all source code using clang-format and
 # excluding some files.
 reformat:
-       find . -name '*.[ch]' \! -name snprintf.c \! -name krb5-profile.c \
-            -print | xargs clang-format-10 -style=file -i
+       find . -name '*.[ch]' \! -name krb5-profile.c -print \
+           | xargs clang-format -style=file -i
diff --git a/NEWS b/NEWS
index c395031b291445ee51d18154578a3a06b597c4a1..3bd766913d63f27159ef1b369b82294fd51e685c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,17 @@ pam-krb5 4.10 (unreleased)
     could result in a double free.  Thanks to Michael Muehle for the
     report.
 
+    Update to rra-c-util 9.0:
+
+    * Check that at least one Kerberos header file was found and works.
+    * Use AS_ECHO in all Autoconf macros in preference to echo.
+    * Fix portability of reallocarray on NetBSD systems.
+    * Stop providing a replacement for a broken snprintf.
+
+    Update to C TAP Harness 4.7:
+
+    * Fix warnings with GCC 10.
+
 pam-krb5 4.9 (2020-03-30)
 
     SECURITY: All previous versions of this module could overflow the
index 4fe9dee969013aaf0f3ec6687c3aa8b87749fc01..b7a72082eae6adedc41e212a8e6aa088d8c471f7 100644 (file)
@@ -1,7 +1,7 @@
 dnl Autoconf configuration for pam-krb5.
 dnl
 dnl Written by Russ Allbery <eagle@eyrie.org>
-dnl Copyright 2005-2009, 2014, 2017, 2020 Russ Allbery <eagle@eyrie.org>
+dnl Copyright 2005-2009, 2014, 2017, 2020-2021 Russ Allbery <eagle@eyrie.org>
 dnl Copyright 2009-2013
 dnl     The Board of Trustees of the Leland Stanford Junior University
 dnl Copyright 2005 Andres Salomon <dilinger@debian.org>
@@ -114,11 +114,10 @@ AC_CHECK_HEADER([regex.h], [AC_CHECK_FUNCS([regcomp])])
 dnl Other probes of the system libraries.
 AC_HEADER_STDBOOL
 AC_CHECK_HEADERS([strings.h sys/bittypes.h sys/select.h sys/time.h])
-AC_CHECK_DECLS([snprintf, vsnprintf])
+AC_CHECK_DECLS([reallocarray])
 AC_TYPE_LONG_LONG_INT
 AC_CHECK_TYPES([ssize_t], [], [],
     [#include <sys/types.h>])
-RRA_FUNC_SNPRINTF
 AC_CHECK_FUNCS([explicit_bzero])
 AC_REPLACE_FUNCS([asprintf issetugid mkstemp reallocarray strndup])
 
index 9a749f71a97869a3731ae3c443d10acebb1f4dfb..99fcdec6001b4ee124142c5c81ca2a9146a241f3 100644 (file)
@@ -1,8 +1,9 @@
 dnl Check whether the compiler supports particular flags.
 dnl
-dnl Provides RRA_PROG_CC_FLAG, which checks whether a compiler supports a
-dnl given flag.  If it does, the commands in the second argument are run.  If
-dnl not, the commands in the third argument are run.
+dnl Provides RRA_PROG_CC_FLAG and RRA_PROG_LD_FLAG, which checks whether a
+dnl compiler supports a given flag for either compilation or linking,
+dnl respectively.  If it does, the commands in the second argument are run.
+dnl If not, the commands in the third argument are run.
 dnl
 dnl Provides RRA_PROG_CC_WARNINGS_FLAGS, which checks whether a compiler
 dnl supports a large set of warning flags and sets the WARNINGS_CFLAGS
@@ -14,7 +15,7 @@ dnl
 dnl The canonical version of this file is maintained in the rra-c-util
 dnl package, available at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
 dnl
-dnl Copyright 2016-2020 Russ Allbery <eagle@eyrie.org>
+dnl Copyright 2016-2021 Russ Allbery <eagle@eyrie.org>
 dnl Copyright 2006, 2009, 2016
 dnl     by Internet Systems Consortium, Inc. ("ISC")
 dnl
@@ -34,16 +35,19 @@ dnl SPDX-License-Identifier: ISC
 
 dnl Used to build the result cache name.
 AC_DEFUN([_RRA_PROG_CC_FLAG_CACHE],
-[translit([rra_cv_compiler_c_$1], [-=+], [___])])
+[translit([rra_cv_compiler_c_$1], [-=+,], [____])])
+AC_DEFUN([_RRA_PROG_LD_FLAG_CACHE],
+[translit([rra_cv_linker_c_$1], [-=+,], [____])])
 
-dnl Check whether a given flag is supported by the compiler.
+dnl Check whether a given flag is supported by the compiler when compiling a C
+dnl source file.
 AC_DEFUN([RRA_PROG_CC_FLAG],
 [AC_REQUIRE([AC_PROG_CC])
  AC_MSG_CHECKING([if $CC supports $1])
  AC_CACHE_VAL([_RRA_PROG_CC_FLAG_CACHE([$1])],
     [save_CFLAGS=$CFLAGS
      AS_CASE([$1],
-        [-Wno-*], [CFLAGS="$CFLAGS `echo "$1" | sed 's/-Wno-/-W/'`"],
+        [-Wno-*], [CFLAGS="$CFLAGS `AS_ECHO(["$1"]) | sed 's/-Wno-/-W/'`"],
         [*],      [CFLAGS="$CFLAGS $1"])
      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [int foo = 0;])],
         [_RRA_PROG_CC_FLAG_CACHE([$1])=yes],
@@ -52,6 +56,21 @@ AC_DEFUN([RRA_PROG_CC_FLAG],
  AC_MSG_RESULT([$_RRA_PROG_CC_FLAG_CACHE([$1])])
  AS_IF([test x"$_RRA_PROG_CC_FLAG_CACHE([$1])" = xyes], [$2], [$3])])
 
+dnl Check whether a given flag is supported by the compiler when linking an
+dnl executable.
+AC_DEFUN([RRA_PROG_LD_FLAG],
+[AC_REQUIRE([AC_PROG_CC])
+ AC_MSG_CHECKING([if $CC supports $1 for linking])
+ AC_CACHE_VAL([_RRA_PROG_LD_FLAG_CACHE([$1])],
+    [save_LDFLAGS=$LDFLAGS
+     LDFLAGS="$LDFLAGS $1"
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([], [int foo = 0;])],
+        [_RRA_PROG_LD_FLAG_CACHE([$1])=yes],
+        [_RRA_PROG_LD_FLAG_CACHE([$1])=no])
+     LDFLAGS=$save_LDFLAGS])
+ AC_MSG_RESULT([$_RRA_PROG_LD_FLAG_CACHE([$1])])
+ AS_IF([test x"$_RRA_PROG_LD_FLAG_CACHE([$1])" = xyes], [$2], [$3])])
+
 dnl Determine the full set of viable warning flags for the current compiler.
 dnl
 dnl This is based partly on personal preference and is a fairly aggressive set
index bbfcdc194e6c5233c1b1ad01f499f01609475742..701881e024a9bf63b26af02d59dcef8fdd6cf7ad 100644 (file)
@@ -11,7 +11,7 @@ dnl The canonical version of this file is maintained in the rra-c-util
 dnl package, available at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
 dnl
 dnl Written by Russ Allbery <eagle@eyrie.org>
-dnl Copyright 2018 Russ Allbery <eagle@eyrie.org>
+dnl Copyright 2018, 2021 Russ Allbery <eagle@eyrie.org>
 dnl Copyright 2011-2012
 dnl     The Board of Trustees of the Leland Stanford Junior University
 dnl
@@ -98,7 +98,7 @@ AC_DEFUN([RRA_KRB5_CONFIG],
              $3[]_LIBS=`"$rra_krb5_config_$3" --libs $2 2>/dev/null`
              rra_krb5_config_$3[]_ok=yes])])])
  AS_IF([test x"$rra_krb5_config_$3[]_ok" = xyes],
-    [$3[]_CPPFLAGS=`echo "$$3[]_CPPFLAGS" | sed 's%-I/usr/include %%'`
-     $3[]_CPPFLAGS=`echo "$$3[]_CPPFLAGS" | sed 's%-I/usr/include$%%'`
+    [$3[]_CPPFLAGS=`AS_ECHO(["$$3[]_CPPFLAGS"]) | sed 's%-I/usr/include %%'`
+     $3[]_CPPFLAGS=`AS_ECHO(["$$3[]_CPPFLAGS"]) | sed 's%-I/usr/include$%%'`
      $4],
     [$5])])
index 617c27b6ab6bb578cfd7a8fa0d9cb33dd9ecb4aa..e6ec1bb09fa5f592bf89573559743f8b0a4f1748 100644 (file)
@@ -17,9 +17,9 @@ dnl
 dnl If KRB5_CPPFLAGS, KRB5_LDFLAGS, or KRB5_LIBS are set before calling these
 dnl macros, their values will be added to whatever the macros discover.
 dnl
-dnl KRB5_CPPFLAGS_GCC will be set to the same value as KRB5_CPPFLAGS but with
-dnl any occurrences of -I changed to -isystem.  This may be useful to suppress
-dnl warnings from the Kerberos header files when building with GCC and
+dnl KRB5_CPPFLAGS_WARNINGS will be set to the same value as KRB5_CPPFLAGS but
+dnl with any occurrences of -I changed to -isystem.  This may be useful to
+dnl suppress warnings from the Kerberos header files when building with and
 dnl aggressive warning flags.  Be aware that this change will change the
 dnl compiler header file search order as well.
 dnl
@@ -50,7 +50,7 @@ dnl The canonical version of this file is maintained in the rra-c-util
 dnl package, available at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
 dnl
 dnl Written by Russ Allbery <eagle@eyrie.org>
-dnl Copyright 2018 Russ Allbery <eagle@eyrie.org>
+dnl Copyright 2018, 2020-2021 Russ Allbery <eagle@eyrie.org>
 dnl Copyright 2005-2011, 2013-2014
 dnl     The Board of Trustees of the Leland Stanford Junior University
 dnl
@@ -60,9 +60,6 @@ dnl notice is preserved.
 dnl
 dnl SPDX-License-Identifier: FSFULLR
 
-dnl Ignore Automake conditionals if not using Automake.
-m4_define_default([AM_CONDITIONAL], [:])
-
 dnl Headers to include when probing for Kerberos library properties.
 AC_DEFUN([RRA_INCLUDES_KRB5], [[
 #if HAVE_KRB5_H
@@ -109,13 +106,14 @@ dnl Check for a header using a file existence check rather than using
 dnl AC_CHECK_HEADERS.  This is used if there were arguments to configure
 dnl specifying the Kerberos header path, since we may have one header in the
 dnl default include path and another under our explicitly-configured Kerberos
-dnl location.
+dnl location.  The second argument is run if the header was found.
 AC_DEFUN([_RRA_LIB_KRB5_CHECK_HEADER],
 [AC_MSG_CHECKING([for $1])
  AS_IF([test -f "${rra_krb5_incroot}/$1"],
     [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_$1]), [1],
         [Define to 1 if you have the <$1> header file.])
-     AC_MSG_RESULT([yes])],
+     AC_MSG_RESULT([yes])
+     $2],
     [AC_MSG_RESULT([no])])])
 
 dnl Check for the com_err header.  Internal helper macro since we need
@@ -127,13 +125,21 @@ AC_DEFUN([_RRA_LIB_KRB5_CHECK_HEADER_COM_ERR],
          _RRA_LIB_KRB5_CHECK_HEADER([kerberosv5/com_err.h])])])
 
 dnl Check for the main Kerberos header.  Internal helper macro since we need
-dnl to do the same checks in multiple places.
+dnl to do the same checks in multiple places.  The first argument is run if
+dnl some header was found, and the second if no header was found.
+dnl header could not be found.
 AC_DEFUN([_RRA_LIB_KRB5_CHECK_HEADER_KRB5],
-[AS_IF([test x"$rra_krb5_incroot" = x],
-     [AC_CHECK_HEADERS([krb5.h kerberosv5/krb5.h krb5/krb5.h])],
-     [_RRA_LIB_KRB5_CHECK_HEADER([krb5.h])
-      _RRA_LIB_KRB5_CHECK_HEADER([kerberosv5/krb5.h])
-      _RRA_LIB_KRB5_CHECK_HEADER([krb5/krb5.h])])])
+[rra_krb5_found_header=
+ AS_IF([test x"$rra_krb5_incroot" = x],
+     [AC_CHECK_HEADERS([krb5.h kerberosv5/krb5.h krb5/krb5.h],
+         [rra_krb5_found_header=true])],
+     [_RRA_LIB_KRB5_CHECK_HEADER([krb5.h],
+         [rra_krb5_found_header=true])
+      _RRA_LIB_KRB5_CHECK_HEADER([kerberosv5/krb5.h],
+         [rra_krb5_found_header=true])
+      _RRA_LIB_KRB5_CHECK_HEADER([krb5/krb5.h],
+         [rra_krb5_found_header=true])])
+ AS_IF([test x"$rra_krb5_found_header" = xtrue], [$1], [$2])])
 
 dnl Does the appropriate library checks for reduced-dependency Kerberos
 dnl linkage.  The single argument, if true, says to fail if Kerberos could not
@@ -143,7 +149,6 @@ AC_DEFUN([_RRA_LIB_KRB5_REDUCED],
  AC_CHECK_LIB([krb5], [krb5_init_context],
     [KRB5_LIBS="-lkrb5"
      LIBS="$KRB5_LIBS $LIBS"
-     _RRA_LIB_KRB5_CHECK_HEADER_KRB5
      AC_CHECK_FUNCS([krb5_get_error_message],
         [AC_CHECK_FUNCS([krb5_free_error_message])],
         [AC_CHECK_FUNCS([krb5_get_error_string], [],
@@ -158,9 +163,14 @@ AC_DEFUN([_RRA_LIB_KRB5_REDUCED],
                         [AS_IF([test x"$1" = xtrue],
                             [AC_MSG_ERROR([cannot find usable com_err library])],
                             [KRB5_LIBS=""])])
-                     _RRA_LIB_KRB5_CHECK_HEADER_COM_ERR])])])])],
-     [AS_IF([test x"$1" = xtrue],
-         [AC_MSG_ERROR([cannot find usable Kerberos library])])])
+                     _RRA_LIB_KRB5_CHECK_HEADER_COM_ERR])])])])
+     _RRA_LIB_KRB5_CHECK_HEADER_KRB5([],
+        [KRB5_CPPFLAGS=
+         KRB5_LIBS=
+         AS_IF([test x"$1" = xtrue],
+            [AC_MSG_ERROR([cannot find usable Kerberos header])])])],
+    [AS_IF([test x"$1" = xtrue],
+        [AC_MSG_ERROR([cannot find usable Kerberos library])])])
  RRA_LIB_KRB5_RESTORE])
 
 dnl Does the appropriate library checks for Kerberos linkage when we don't
@@ -207,7 +217,6 @@ AC_DEFUN([_RRA_LIB_KRB5_MANUAL],
         [$rra_krb5_extra])],
     [-lasn1 -lcom_err -lcrypto $rra_krb5_extra])
  LIBS="$KRB5_LIBS $LIBS"
- _RRA_LIB_KRB5_CHECK_HEADER_KRB5
  AC_CHECK_FUNCS([krb5_get_error_message],
      [AC_CHECK_FUNCS([krb5_free_error_message])],
      [AC_CHECK_FUNCS([krb5_get_error_string], [],
@@ -216,6 +225,11 @@ AC_DEFUN([_RRA_LIB_KRB5_MANUAL],
                  [AC_CHECK_HEADERS([ibm_svc/krb5_svc.h], [], [],
                      [RRA_INCLUDES_KRB5])],
                  [_RRA_LIB_KRB5_CHECK_HEADER_COM_ERR])])])])
+ _RRA_LIB_KRB5_CHECK_HEADER_KRB5([],
+    [KRB5_CPPFLAGS=
+     KRB5_LIBS=
+     AS_IF([test x"$1" = xtrue],
+        [AC_MSG_ERROR([cannot find usable Kerberos header])])])
  RRA_LIB_KRB5_RESTORE])
 
 dnl Sanity-check the results of krb5-config and be sure we can really link a
@@ -225,7 +239,12 @@ dnl check.
 AC_DEFUN([_RRA_LIB_KRB5_CHECK],
 [RRA_LIB_KRB5_SWITCH
  AC_CHECK_FUNC([krb5_init_context],
-    [RRA_LIB_KRB5_RESTORE],
+    [_RRA_LIB_KRB5_CHECK_HEADER_KRB5([RRA_LIB_KRB5_RESTORE],
+        [RRA_LIB_KRB5_RESTORE
+         KRB5_CPPFLAGS=
+         KRB5_LIBS=
+         _RRA_LIB_KRB5_PATHS
+         _RRA_LIB_KRB5_MANUAL([$1])])],
     [RRA_LIB_KRB5_RESTORE
      KRB5_CPPFLAGS=
      KRB5_LIBS=
@@ -239,7 +258,6 @@ AC_DEFUN([_RRA_LIB_KRB5_CONFIG],
 [RRA_KRB5_CONFIG([${rra_krb5_root}], [krb5], [KRB5],
     [_RRA_LIB_KRB5_CHECK([$1])
      RRA_LIB_KRB5_SWITCH
-     _RRA_LIB_KRB5_CHECK_HEADER_KRB5
      AC_CHECK_FUNCS([krb5_get_error_message],
          [AC_CHECK_FUNCS([krb5_free_error_message])],
          [AC_CHECK_FUNCS([krb5_get_error_string], [],
@@ -260,7 +278,7 @@ AC_DEFUN([_RRA_LIB_KRB5_INTERNAL],
 [AC_REQUIRE([RRA_ENABLE_REDUCED_DEPENDS])
  rra_krb5_incroot=
  AC_SUBST([KRB5_CPPFLAGS])
- AC_SUBST([KRB5_CPPFLAGS_GCC])
+ AC_SUBST([KRB5_CPPFLAGS_WARNINGS])
  AC_SUBST([KRB5_LDFLAGS])
  AC_SUBST([KRB5_LIBS])
  AS_IF([test x"$rra_krb5_includedir" != x],
@@ -278,7 +296,7 @@ AC_DEFUN([_RRA_LIB_KRB5_INTERNAL],
  AS_CASE([$KRB5_LIBS], [*-lcom_err*], [rra_krb5_uses_com_err=true])
  AM_CONDITIONAL([KRB5_USES_COM_ERR],
     [test x"$rra_krb5_uses_com_err" = xtrue])
- KRB5_CPPFLAGS_GCC=`echo "$KRB5_CPPFLAGS" | sed -e 's/-I/-isystem /g'`])
+ KRB5_CPPFLAGS_WARNINGS=`AS_ECHO(["$KRB5_CPPFLAGS"]) | sed 's/-I/-isystem /g'`])
 
 dnl The main macro for packages with mandatory Kerberos support.
 AC_DEFUN([RRA_LIB_KRB5],
index 46e887978e4e541c5cee1494706f0bf641aab203..7d9b5227c1880fff27b0208c1b106319c670c1a6 100644 (file)
@@ -16,6 +16,7 @@ dnl The canonical version of this file is maintained in the rra-c-util
 dnl package, available at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
 dnl
 dnl Written by Russ Allbery <eagle@eyrie.org>
+dnl Copyright 2021 Russ Allbery <eagle@eyrie.org>
 dnl Copyright 2008-2009
 dnl     The Board of Trustees of the Leland Stanford Junior University
 dnl
@@ -53,7 +54,7 @@ AC_DEFUN([RRA_SET_LDFLAGS],
     [AS_IF([test x"$3" = x],
         [$1="[$]$1 -L$2/lib"],
         [$1="[$]$1 -L$2/lib/$3"])])
- $1=`echo "[$]$1" | sed -e 's/^ *//'`])
+ $1=`AS_ECHO(["[$]$1"]) | sed -e 's/^ *//'`])
 
 dnl Set libdir to PREFIX/lib{,32,64} as appropriate.
 AC_DEFUN([RRA_SET_LIBDIR],
index 03b4fb5e2581cf854df477c262b3015358750005..3423d1a60d3f759628478c599bccab90fabd9952 100644 (file)
@@ -2,10 +2,10 @@ dnl Determine whether PAM uses const in prototypes.
 dnl
 dnl Linux marks several PAM arguments const, including the argument to
 dnl pam_get_item and some arguments to conversation functions, which Solaris
-dnl doesn't.  Mac OS X marks the first argument to pam_strerror const, and
-dnl other platforms don't.  This test tries to determine which style is in use
-dnl to select whether to declare variables const and how to prototype
-dnl functions in order to avoid compiler warnings.
+dnl doesn't.  Mac OS X, OS X, and macOS mark the first argument to
+dnl pam_strerror const, and other platforms don't.  This test tries to
+dnl determine which style is in use to select whether to declare variables
+dnl const and how to prototype functions in order to avoid compiler warnings.
 dnl
 dnl Since this is just for compiler warnings, it's not horribly important if
 dnl we guess wrong.  This test is ugly, but it seems to work.
diff --git a/m4/snprintf.m4 b/m4/snprintf.m4
deleted file mode 100644 (file)
index e739bbf..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-dnl Test for a working C99 snprintf.
-dnl
-dnl Check for a working snprintf.  Some systems have an snprintf that doesn't
-dnl nul-terminate if the buffer isn't large enough.  Others return -1 if the
-dnl string doesn't fit into the buffer instead of returning the number of
-dnl characters that would have been formatted.  Still others don't support
-dnl NULL as the buffer argument (just to get a count of the formatted length).
-dnl
-dnl Provides RRA_FUNC_SNPRINTF, which adds snprintf.o to LIBOBJS unless a
-dnl fully working snprintf is found.
-dnl
-dnl The canonical version of this file is maintained in the rra-c-util
-dnl package, available at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
-dnl
-dnl Written by Russ Allbery <eagle@eyrie.org>
-dnl Copyright 2006, 2008-2009
-dnl     The Board of Trustees of the Leland Stanford Junior University
-dnl
-dnl This file is free software; the authors give unlimited permission to copy
-dnl and/or distribute it, with or without modifications, as long as this
-dnl notice is preserved.
-dnl
-dnl SPDX-License-Identifier: FSFULLR
-
-dnl Source used by RRA_FUNC_SNPRINTF.
-AC_DEFUN([_RRA_FUNC_SNPRINTF_SOURCE], [[
-#include <stdio.h>
-#include <stdarg.h>
-
-char buf[2];
-
-int
-test(char *format, ...)
-{
-    va_list args;
-    int count;
-
-    va_start(args, format);
-    count = vsnprintf(buf, sizeof buf, format, args);
-    va_end(args);
-    return count;
-}
-
-int
-main()
-{
-    return ((test("%s", "abcd") == 4 && buf[0] == 'a' && buf[1] == '\0'
-             && snprintf(NULL, 0, "%s", "abcd") == 4) ? 0 : 1);
-}
-]])
-
-dnl The user-callable test.
-AC_DEFUN([RRA_FUNC_SNPRINTF],
-[AC_CACHE_CHECK([for working snprintf], [rra_cv_func_snprintf_works],
-    [AC_RUN_IFELSE([AC_LANG_SOURCE([_RRA_FUNC_SNPRINTF_SOURCE])],
-        [rra_cv_func_snprintf_works=yes],
-        [rra_cv_func_snprintf_works=no],
-        [rra_cv_func_snprintf_works=no])])
- AS_IF([test x"$rra_cv_func_snprintf_works" = xyes],
-    [AC_DEFINE([HAVE_SNPRINTF], 1,
-        [Define if your system has a working snprintf function.])],
-    [AC_LIBOBJ([snprintf])])])
diff --git a/portable/snprintf.c b/portable/snprintf.c
deleted file mode 100644 (file)
index a22e4e4..0000000
+++ /dev/null
@@ -1,992 +0,0 @@
-/*
- * Replacement for a missing snprintf or vsnprintf.
- *
- * The following implementation of snprintf was taken mostly verbatim from
- * <http://www.fiction.net/blong/programs/>; it is the version of snprintf
- * used in Mutt.  A possibly newer version is used in wget, found at
- * <https://github.com/wertarbyte/wget/blob/master/src/snprintf.c>.
- *
- * Please do not reformat or otherwise change this file more than necessary so
- * that later merges with the original source are easy.  Bug fixes and
- * improvements should be sent back to the original author.
- *
- * The canonical version of this file is maintained in the rra-c-util package,
- * which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
- */
-
-/*
- * If we're running the test suite, rename snprintf and vsnprintf to avoid
- * conflicts with the system version.
- */
-#if TESTING
-# undef snprintf
-# undef vsnprintf
-# define snprintf test_snprintf
-# define vsnprintf test_vsnprintf
-#endif
-
-/*
- * __attribute__ is available in gcc 2.5 and later, but only with gcc 2.7
- * could you use the __format__ form of the attributes, which is what we use
- * (to avoid confusion with other macros).
- */
-#ifndef __attribute__
-#    if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
-#        define __attribute__(spec) /* empty */
-#    endif
-#endif
-
-/*
- * Older Clang doesn't support __attribute__((fallthrough)) properly and
- * complains about the empty statement that it is decorating.  Suppress that
- * warning.  Also suppress warnings about unknown attributes to handle older
- * Clang versions.
- */
-#if !defined(__attribute__) && (defined(__llvm__) || defined(__clang__))
-#    pragma GCC diagnostic ignored "-Wattributes"
-#    pragma GCC diagnostic ignored "-Wmissing-declarations"
-#endif
-
-/* Specific to rra-c-util, but only when debugging is enabled. */
-#ifdef DEBUG_SNPRINTF
-# include <util/messages.h>
-#endif
-
-/*
- * Copyright Patrick Powell 1995
- * This code is based on code written by Patrick Powell (papowell@astart.com)
- * It may be used for any purpose as long as this notice remains intact
- * on all source code distributions
- *
- * There is no SPDX-License-Identifier registered for this license.
- */
-
-/**************************************************************
- * Original:
- * Patrick Powell Tue Apr 11 09:48:21 PDT 1995
- * A bombproof version of doprnt (dopr) included.
- * Sigh.  This sort of thing is always nasty do deal with.  Note that
- * the version here does not include floating point...
- *
- * snprintf() is used instead of sprintf() as it does limit checks
- * for string length.  This covers a nasty loophole.
- *
- * The other functions are there to prevent NULL pointers from
- * causing nast effects.
- *
- * More Recently:
- *  Brandon Long <blong@fiction.net> 9/15/96 for mutt 0.43
- *  This was ugly.  It is still ugly.  I opted out of floating point
- *  numbers, but the formatter understands just about everything
- *  from the normal C string format, at least as far as I can tell from
- *  the Solaris 2.5 printf(3S) man page.
- *
- *  Brandon Long <blong@fiction.net> 10/22/97 for mutt 0.87.1
- *    Ok, added some minimal floating point support, which means this
- *    probably requires libm on most operating systems.  Don't yet
- *    support the exponent (e,E) and sigfig (g,G).  Also, fmtint()
- *    was pretty badly broken, it just wasn't being exercised in ways
- *    which showed it, so that's been fixed.  Also, formatted the code
- *    to mutt conventions, and removed dead code left over from the
- *    original.  Also, there is now a builtin-test, just compile with:
- *           gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm
- *    and run snprintf for results.
- * 
- *  Thomas Roessler <roessler@guug.de> 01/27/98 for mutt 0.89i
- *    The PGP code was using unsigned hexadecimal formats. 
- *    Unfortunately, unsigned formats simply didn't work.
- *
- *  Michael Elkins <me@cs.hmc.edu> 03/05/98 for mutt 0.90.8
- *    The original code assumed that both snprintf() and vsnprintf() were
- *    missing.  Some systems only have snprintf() but not vsnprintf(), so
- *    the code is now broken down under HAVE_SNPRINTF and HAVE_VSNPRINTF.
- *
- *  Andrew Tridgell (tridge@samba.org) Oct 1998
- *    fixed handling of %.0f
- *    added test for HAVE_LONG_DOUBLE
- *
- *  Russ Allbery <eagle@eyrie.org> 2000-08-26
- *    fixed return value to comply with C99
- *    fixed handling of snprintf(NULL, ...)
- *    added explicit casts for double to long long int conversion
- *    fixed various warnings with GCC 7
- *    fixed various warnings with Clang
- *
- *  Hrvoje Niksic <hniksic@xemacs.org> 2000-11-04
- *    include <config.h> instead of "config.h".
- *    moved TEST_SNPRINTF stuff out of HAVE_SNPRINTF ifdef.
- *    include <stdio.h> for NULL.
- *    added support and test cases for long long.
- *    don't declare argument types to (v)snprintf if stdarg is not used.
- *    use int instead of short int as 2nd arg to va_arg.
- *
- *  alexk (INN) 2002-08-21
- *    use LLONG in fmtfp to handle more characters during floating
- *    point conversion.
- *
- *  herb (Samba) 2002-12-19
- *    actually print args for %g and %e
- *
- *  Hrvoje Niksic <hniksic@xemacs.org> 2005-04-15
- *    use the PARAMS macro to handle prototypes.
- *    write function definitions in the ansi2knr-friendly way.
- *    if string precision is specified, don't read VALUE past it.
- *    fix bug in fmtfp that caused 0.01 to be printed as 0.1.
- *    don't include <ctype.h> because none of it is used.
- *    interpret precision as number of significant digits with %g
- *    omit trailing decimal zeros with %g
- *
- **************************************************************/
-
-#include <config.h>
-
-#include <string.h>
-#include <ctype.h>
-#include <sys/types.h>
-
-#ifndef NULL
-# define NULL 0
-#endif
-
-/* varargs declarations: */
-
-#include <stdarg.h>
-
-/* Assume all compilers support long double, per Autoconf documentation. */
-#define LDOUBLE long double
-
-#ifdef HAVE_LONG_LONG_INT
-# define LLONG long long
-#else
-# define LLONG long
-#endif
-
-int snprintf (char *str, size_t count, const char *fmt, ...);
-int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);
-
-static int dopr (char *buffer, size_t maxlen, const char *format, 
-                 va_list args);
-static int fmtstr (char *buffer, size_t *currlen, size_t maxlen,
-                  const char *value, int flags, int min, int max);
-static int fmtint (char *buffer, size_t *currlen, size_t maxlen,
-                  LLONG value, int base, int min, int max, int flags);
-static int fmtfp (char *buffer, size_t *currlen, size_t maxlen,
-                 LDOUBLE fvalue, int min, int max, int flags);
-static int dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c );
-
-/*
- * dopr(): poor man's version of doprintf
- */
-
-/* format read states */
-#define DP_S_DEFAULT 0
-#define DP_S_FLAGS   1
-#define DP_S_MIN     2
-#define DP_S_DOT     3
-#define DP_S_MAX     4
-#define DP_S_MOD     5
-#define DP_S_MOD_L   6
-#define DP_S_CONV    7
-#define DP_S_DONE    8
-
-/* format flags - Bits */
-#define DP_F_MINUS     (1 << 0)
-#define DP_F_PLUS      (1 << 1)
-#define DP_F_SPACE     (1 << 2)
-#define DP_F_NUM       (1 << 3)
-#define DP_F_ZERO      (1 << 4)
-#define DP_F_UP        (1 << 5)
-#define DP_F_UNSIGNED  (1 << 6)
-#define DP_F_FP_G      (1 << 7)
-
-/* Conversion Flags */
-#define DP_C_SHORT   1
-#define DP_C_LONG    2
-#define DP_C_LLONG   3
-#define DP_C_LDOUBLE 4
-
-#define char_to_int(p) (p - '0')
-#define MAX(p,q) ((p >= q) ? p : q)
-#define MIN(p,q) ((p <= q) ? p : q)
-
-static int dopr (char *buffer, size_t maxlen, const char *format, va_list args)
-{
-  char ch;
-  LLONG value;
-  LDOUBLE fvalue;
-  char *strvalue;
-  int min;
-  int max;
-  unsigned int state;
-  int flags;
-  int cflags;
-  int total;
-  size_t currlen;
-  
-  state = DP_S_DEFAULT;
-  currlen = flags = cflags = min = 0;
-  max = -1;
-  ch = *format++;
-  total = 0;
-
-  while (state != DP_S_DONE)
-  {
-    if (ch == '\0')
-      state = DP_S_DONE;
-
-    switch(state) 
-    {
-    case DP_S_DEFAULT:
-      if (ch == '%') 
-       state = DP_S_FLAGS;
-      else 
-       total += dopr_outch (buffer, &currlen, maxlen, ch);
-      ch = *format++;
-      break;
-    case DP_S_FLAGS:
-      switch (ch) 
-      {
-      case '-':
-       flags |= DP_F_MINUS;
-        ch = *format++;
-       break;
-      case '+':
-       flags |= DP_F_PLUS;
-        ch = *format++;
-       break;
-      case ' ':
-       flags |= DP_F_SPACE;
-        ch = *format++;
-       break;
-      case '#':
-       flags |= DP_F_NUM;
-        ch = *format++;
-       break;
-      case '0':
-       flags |= DP_F_ZERO;
-        ch = *format++;
-       break;
-      default:
-       state = DP_S_MIN;
-       break;
-      }
-      break;
-    case DP_S_MIN:
-      if ('0' <= ch && ch <= '9') 
-      {
-       min = 10*min + char_to_int (ch);
-       ch = *format++;
-      } 
-      else if (ch == '*') 
-      {
-       min = va_arg (args, int);
-       ch = *format++;
-       state = DP_S_DOT;
-      } 
-      else 
-       state = DP_S_DOT;
-      break;
-    case DP_S_DOT:
-      if (ch == '.') 
-      {
-       state = DP_S_MAX;
-       ch = *format++;
-      } 
-      else 
-       state = DP_S_MOD;
-      break;
-    case DP_S_MAX:
-      if ('0' <= ch && ch <= '9')
-      {
-       if (max < 0)
-         max = 0;
-       max = 10*max + char_to_int (ch);
-       ch = *format++;
-      } 
-      else if (ch == '*') 
-      {
-       max = va_arg (args, int);
-       ch = *format++;
-       state = DP_S_MOD;
-      } 
-      else 
-       state = DP_S_MOD;
-      break;
-    case DP_S_MOD:
-      switch (ch) 
-      {
-      case 'h':
-       cflags = DP_C_SHORT;
-       ch = *format++;
-       break;
-      case 'l':
-       cflags = DP_C_LONG;
-       ch = *format++;
-       break;
-      case 'L':
-       cflags = DP_C_LDOUBLE;
-       ch = *format++;
-       break;
-      default:
-       break;
-      }
-      if (cflags != DP_C_LONG)
-        state = DP_S_CONV;
-      else
-        state = DP_S_MOD_L;
-      break;
-    case DP_S_MOD_L:
-      switch (ch)
-      {
-      case 'l':
-        cflags = DP_C_LLONG;
-        ch = *format++;
-        break;
-      default:
-        break;
-      }
-      state = DP_S_CONV;
-      break;
-    case DP_S_CONV:
-      switch (ch) 
-      {
-      case 'd':
-      case 'i':
-       if (cflags == DP_C_SHORT) 
-         value = (short int) va_arg (args, int);
-       else if (cflags == DP_C_LONG)
-         value = va_arg (args, long int);
-        else if (cflags == DP_C_LLONG)
-          value = va_arg (args, LLONG);
-       else
-         value = va_arg (args, int);
-       total += fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
-       break;
-      case 'o':
-       flags |= DP_F_UNSIGNED;
-       if (cflags == DP_C_SHORT)
-         value = (unsigned short int) va_arg (args, unsigned int);
-       else if (cflags == DP_C_LONG)
-         value = va_arg (args, unsigned long int);
-        else if (cflags == DP_C_LLONG)
-          value = va_arg (args, unsigned LLONG);
-       else
-         value = va_arg (args, unsigned int);
-       total += fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags);
-       break;
-      case 'u':
-       flags |= DP_F_UNSIGNED;
-       if (cflags == DP_C_SHORT)
-         value = (unsigned short int) va_arg (args, unsigned int);
-       else if (cflags == DP_C_LONG)
-         value = va_arg (args, unsigned long int);
-        else if (cflags == DP_C_LLONG)
-          value = va_arg (args, unsigned LLONG);
-       else
-         value = va_arg (args, unsigned int);
-       total += fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
-       break;
-      case 'X':
-       flags |= DP_F_UP;
-        __attribute__((fallthrough));
-        /* fall through */
-      case 'x':
-       flags |= DP_F_UNSIGNED;
-       if (cflags == DP_C_SHORT)
-         value = (unsigned short int) va_arg (args, unsigned int);
-       else if (cflags == DP_C_LONG)
-         value = va_arg (args, unsigned long int);
-        else if (cflags == DP_C_LLONG)
-          value = va_arg (args, unsigned LLONG);
-       else
-         value = va_arg (args, unsigned int);
-       total += fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags);
-       break;
-      case 'f':
-       if (cflags == DP_C_LDOUBLE)
-         fvalue = va_arg (args, LDOUBLE);
-       else
-         fvalue = (LDOUBLE) va_arg (args, double);
-       total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
-       break;
-      case 'E':
-       flags |= DP_F_UP;
-        __attribute__((fallthrough));
-        /* fall through */
-      case 'e':
-       if (cflags == DP_C_LDOUBLE)
-         fvalue = va_arg (args, LDOUBLE);
-       else
-         fvalue = (LDOUBLE) va_arg (args, double);
-        total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
-       break;
-      case 'G':
-       flags |= DP_F_UP;
-        __attribute__((fallthrough));
-        /* fall through */
-      case 'g':
-        flags |= DP_F_FP_G;
-       if (cflags == DP_C_LDOUBLE)
-         fvalue = va_arg (args, LDOUBLE);
-       else
-         fvalue = (LDOUBLE) va_arg (args, double);
-       if (max == 0)
-         /* C99 says: if precision [for %g] is zero, it is taken as one */
-         max = 1;
-       total += fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
-       break;
-      case 'c':
-       total += dopr_outch (buffer, &currlen, maxlen,
-                            (char) va_arg (args, int));
-       break;
-      case 's':
-       strvalue = va_arg (args, char *);
-       total += fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max);
-       break;
-      case 'p':
-       strvalue = va_arg (args, void *);
-       total += fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min,
-                         max, flags);
-       break;
-      case 'n':
-       if (cflags == DP_C_SHORT) 
-       {
-         short int *num;
-         num = va_arg (args, short int *);
-         *num = (short) currlen;
-        } 
-       else if (cflags == DP_C_LONG) 
-       {
-         long int *num;
-         num = va_arg (args, long int *);
-         *num = currlen;
-        }
-        else if (cflags == DP_C_LLONG) 
-        {
-          LLONG *num;
-          num = va_arg (args, LLONG *);
-          *num = currlen;
-        } 
-       else 
-       {
-         int *num;
-         num = va_arg (args, int *);
-         *num = (int) currlen;
-        }
-       break;
-      case '%':
-       total += dopr_outch (buffer, &currlen, maxlen, ch);
-       break;
-      case 'w':
-       /* not supported yet, treat as next char */
-       format++;
-       break;
-      default:
-       /* Unknown, skip */
-       break;
-      }
-      ch = *format++;
-      state = DP_S_DEFAULT;
-      flags = cflags = min = 0;
-      max = -1;
-      break;
-    case DP_S_DONE:
-      break;
-    default:
-      /* hmm? */
-      break; /* some picky compilers need this */
-    }
-  }
-  if (buffer != NULL)
-  {
-    if (currlen < maxlen - 1) 
-      buffer[currlen] = '\0';
-    else 
-      buffer[maxlen - 1] = '\0';
-  }
-  return total;
-}
-
-static int fmtstr (char *buffer, size_t *currlen, size_t maxlen,
-                   const char *value, int flags, int min, int max)
-{
-  int padlen, strln;     /* amount to pad */
-  int cnt = 0;
-  int total = 0;
-  
-  if (value == 0)
-  {
-    value = "(null)";
-  }
-
-  if (max < 0)
-    strln = (int) strlen (value);
-  else
-    /* When precision is specified, don't read VALUE past precision. */
-    /*strln = strnlen (value, max);*/
-    for (strln = 0; strln < max && value[strln]; ++strln);
-  padlen = min - strln;
-  if (padlen < 0) 
-    padlen = 0;
-  if (flags & DP_F_MINUS) 
-    padlen = -padlen; /* Left Justify */
-
-  while (padlen > 0)
-  {
-    total += dopr_outch (buffer, currlen, maxlen, ' ');
-    --padlen;
-  }
-  while (*value && ((max < 0) || (cnt < max)))
-  {
-    total += dopr_outch (buffer, currlen, maxlen, *value++);
-    ++cnt;
-  }
-  while (padlen < 0)
-  {
-    total += dopr_outch (buffer, currlen, maxlen, ' ');
-    ++padlen;
-  }
-  return total;
-}
-
-/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */
-
-static int fmtint (char *buffer, size_t *currlen, size_t maxlen,
-                  LLONG value, int base, int min, int max, int flags)
-{
-  char signvalue = 0;
-  unsigned LLONG uvalue;
-  char convert[24];
-  unsigned int place = 0;
-  int spadlen = 0; /* amount to space pad */
-  int zpadlen = 0; /* amount to zero pad */
-  const char *digits;
-  int total = 0;
-  
-  if (max < 0)
-    max = 0;
-
-  uvalue = value;
-
-  if(!(flags & DP_F_UNSIGNED))
-  {
-    if( value < 0 ) {
-      signvalue = '-';
-      uvalue = -value;
-    }
-    else
-      if (flags & DP_F_PLUS)  /* Do a sign (+/i) */
-       signvalue = '+';
-    else
-      if (flags & DP_F_SPACE)
-       signvalue = ' ';
-  }
-  
-  if (flags & DP_F_UP)
-    /* Should characters be upper case? */
-    digits = "0123456789ABCDEF";
-  else
-    digits = "0123456789abcdef";
-
-  do {
-    convert[place++] = digits[uvalue % (unsigned)base];
-    uvalue = (uvalue / (unsigned)base );
-  } while(uvalue && (place < sizeof (convert)));
-  if (place == sizeof (convert)) place--;
-  convert[place] = 0;
-
-  zpadlen = max - place;
-  spadlen = min - MAX ((unsigned int)max, place) - (signvalue ? 1 : 0);
-  if (zpadlen < 0) zpadlen = 0;
-  if (spadlen < 0) spadlen = 0;
-  if (flags & DP_F_ZERO)
-  {
-    zpadlen = MAX(zpadlen, spadlen);
-    spadlen = 0;
-  }
-  if (flags & DP_F_MINUS) 
-    spadlen = -spadlen; /* Left Justifty */
-
-#ifdef DEBUG_SNPRINTF
-  debug ("zpad: %d, spad: %d, min: %d, max: %d, place: %u\n",
-         zpadlen, spadlen, min, max, place);
-#endif
-
-  /* Spaces */
-  while (spadlen > 0) 
-  {
-    total += dopr_outch (buffer, currlen, maxlen, ' ');
-    --spadlen;
-  }
-
-  /* Sign */
-  if (signvalue) 
-    total += dopr_outch (buffer, currlen, maxlen, signvalue);
-
-  /* Zeros */
-  if (zpadlen > 0) 
-  {
-    while (zpadlen > 0)
-    {
-      total += dopr_outch (buffer, currlen, maxlen, '0');
-      --zpadlen;
-    }
-  }
-
-  /* Digits */
-  while (place > 0) 
-    total += dopr_outch (buffer, currlen, maxlen, convert[--place]);
-  
-  /* Left Justified spaces */
-  while (spadlen < 0) {
-    total += dopr_outch (buffer, currlen, maxlen, ' ');
-    ++spadlen;
-  }
-
-  return total;
-}
-
-static LDOUBLE abs_val (LDOUBLE value)
-{
-  LDOUBLE result = value;
-
-  if (value < 0)
-    result = -value;
-
-  return result;
-}
-
-static LLONG pow10_int (unsigned int exp)
-{
-  LDOUBLE result = 1;
-
-  while (exp)
-  {
-    result *= 10;
-    exp--;
-  }
-  
-  return (LLONG) result;
-}
-
-static LLONG round_int (LDOUBLE value)
-{
-  LLONG intpart;
-
-  intpart = (LLONG) value;
-  value = value - intpart;
-  if (value >= (LDOUBLE) 0.5)
-    intpart++;
-
-  return intpart;
-}
-
-/*
- * GCC 7.1 issues this warning at the point of the function definition header
- * (not in any actual code), and I can't figure out what's triggering it since
- * the comparison form doesn't appear anywhere in this code.  Since this is
- * rarely-used portability code, suppress the warning.
- */
-#pragma GCC diagnostic ignored "-Wstrict-overflow"
-
-static int fmtfp (char *buffer, size_t *currlen, size_t maxlen,
-                 LDOUBLE fvalue, int min, int max, int flags)
-{
-  char signvalue = 0;
-  LDOUBLE ufvalue;
-  char iconvert[24];
-  char fconvert[24];
-  size_t iplace = 0;
-  size_t fplace = 0;
-  long padlen = 0; /* amount to pad */
-  long zpadlen = 0; 
-  int total = 0;
-  LLONG intpart;
-  LLONG fracpart;
-  LLONG mask10;
-  int leadingfrac0s = 0; /* zeroes at the start of fractional part */
-  int omitzeros = 0;
-  size_t omitcount = 0;
-  
-  /* 
-   * AIX manpage says the default is 0, but Solaris says the default
-   * is 6, and sprintf on AIX defaults to 6
-   */
-  if (max < 0)
-    max = 6;
-
-  ufvalue = abs_val (fvalue);
-
-  if (fvalue < 0)
-    signvalue = '-';
-  else
-    if (flags & DP_F_PLUS)  /* Do a sign (+/i) */
-      signvalue = '+';
-    else
-      if (flags & DP_F_SPACE)
-       signvalue = ' ';
-
-#if 0
-  if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
-#endif
-
-  intpart = (LLONG) ufvalue;
-
-  /* With %g precision is the number of significant digits, which
-     includes the digits in intpart. */
-  if (flags & DP_F_FP_G)
-    {
-      if (intpart != 0)
-       {
-         /* For each digit of INTPART, print one less fractional digit. */
-         LLONG temp;
-         for (temp = intpart; temp != 0; temp /= 10)
-           --max;
-         if (max < 0)
-           max = 0;
-       }
-      else
-       {
-         /* For each leading 0 in fractional part, print one more
-            fractional digit. */
-         LDOUBLE temp;
-         if (ufvalue > 0)
-           for (temp = ufvalue; temp < (LDOUBLE) 0.1; temp *= 10)
-             ++max;
-       }
-    }
-
-  /* C99: trailing zeros are removed from the fractional portion of the
-     result unless the # flag is specified */
-  if ((flags & DP_F_FP_G) && !(flags & DP_F_NUM))
-    omitzeros = 1;
-
-#if SIZEOF_LONG_LONG > 0
-# define MAX_DIGITS 18         /* grok more digits with long long */
-#else
-# define MAX_DIGITS 9          /* just long */
-#endif
-
-  /* 
-   * Sorry, we only support several digits past the decimal because of
-   * our conversion method
-   */
-  if (max > MAX_DIGITS)
-    max = MAX_DIGITS;
-
-  /* Factor of 10 with the needed number of digits, e.g. 1000 for max==3 */
-  mask10 = pow10_int (max);
-
-  /* We "cheat" by converting the fractional part to integer by
-   * multiplying by a factor of 10
-   */
-  fracpart = round_int (mask10 * (ufvalue - intpart));
-
-  if (fracpart >= mask10)
-  {
-    intpart++;
-    fracpart -= mask10;
-  }
-  else if (fracpart != 0)
-    /* If fracpart has less digits than the 10* mask, we need to
-       manually insert leading 0s.  For example 2.01's fractional part
-       requires one leading zero to distinguish it from 2.1. */
-    while (fracpart < mask10 / 10)
-      {
-       ++leadingfrac0s;
-       mask10 /= 10;
-      }
-
-#ifdef DEBUG_SNPRINTF
-# ifdef HAVE_LONG_LONG_INT
-  debug ("fmtfp: %Lf =? %lld.%lld\n", fvalue, intpart, fracpart);
-# else
-  debug ("fmtfp: %Lf =? %ld.%ld\n", fvalue, intpart, fracpart);
-# endif
-#endif
-
-  /* Convert integer part */
-  do {
-    iconvert[iplace++] = (char) ('0' + (intpart % 10));
-    intpart = (intpart / 10);
-  } while(intpart && (iplace < sizeof(iconvert)));
-  if (iplace == sizeof(iconvert)) iplace--;
-  iconvert[iplace] = 0;
-
-  /* Convert fractional part */
-  do {
-    fconvert[fplace++] = (char) ('0' + (fracpart % 10));
-    fracpart = (fracpart / 10);
-  } while(fracpart && (fplace < sizeof(fconvert)));
-  while (leadingfrac0s-- > 0 && fplace < sizeof(fconvert))
-    fconvert[fplace++] = '0';
-  if (fplace == sizeof(fconvert)) fplace--;
-  fconvert[fplace] = 0;
-  if (omitzeros)
-    while (omitcount < fplace && fconvert[omitcount] == '0')
-      ++omitcount;
-
-  /* -1 for decimal point, another -1 if we are printing a sign */
-  padlen = min - iplace - (max - omitcount) - 1 - ((signvalue) ? 1 : 0);
-  if (!omitzeros)
-    zpadlen = max - fplace;
-  if (zpadlen < 0)
-    zpadlen = 0;
-  if (padlen < 0) 
-    padlen = 0;
-  if (flags & DP_F_MINUS) 
-    padlen = -padlen; /* Left Justifty */
-
-  if ((flags & DP_F_ZERO) && (padlen > 0)) 
-  {
-    if (signvalue) 
-    {
-      total += dopr_outch (buffer, currlen, maxlen, signvalue);
-      --padlen;
-      signvalue = 0;
-    }
-    while (padlen > 0)
-    {
-      total += dopr_outch (buffer, currlen, maxlen, '0');
-      --padlen;
-    }
-  }
-  while (padlen > 0)
-  {
-    total += dopr_outch (buffer, currlen, maxlen, ' ');
-    --padlen;
-  }
-  if (signvalue) 
-    total += dopr_outch (buffer, currlen, maxlen, signvalue);
-
-  while (iplace > 0) 
-    total += dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]);
-
-  /*
-   * Decimal point.  This should probably use locale to find the correct
-   * char to print out.
-   */
-  if (max > 0 && (fplace > omitcount || zpadlen > 0))
-  {
-    total += dopr_outch (buffer, currlen, maxlen, '.');
-
-    while (fplace > omitcount) 
-      total += dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]);
-  }
-
-  while (zpadlen > 0)
-  {
-    total += dopr_outch (buffer, currlen, maxlen, '0');
-    --zpadlen;
-  }
-
-  while (padlen < 0) 
-  {
-    total += dopr_outch (buffer, currlen, maxlen, ' ');
-    ++padlen;
-  }
-
-  return total;
-}
-
-static int dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c)
-{
-  if (*currlen + 1 < maxlen)
-    buffer[(*currlen)++] = c;
-  return 1;
-}
-
-int vsnprintf (char *str, size_t count, const char *fmt, va_list args)
-{
-  if (str != NULL)
-    str[0] = 0;
-  return dopr(str, count, fmt, args);
-}
-
-int snprintf (char *str, size_t count, const char *fmt,...)
-{
-  va_list ap;
-  int total;
-    
-  va_start(ap, fmt);
-  total = vsnprintf(str, count, fmt, ap);
-  va_end(ap);
-  return total;
-}
-
-#ifdef TEST_SNPRINTF
-#ifndef LONG_STRING
-#define LONG_STRING 1024
-#endif
-int main (void)
-{
-  char buf1[LONG_STRING];
-  char buf2[LONG_STRING];
-  char *fp_fmt[] = {
-    "%-1.5f",
-    "%1.5f",
-    "%123.9f",
-    "%10.5f",
-    "% 10.5f",
-    "%+22.9f",
-    "%+4.9f",
-    "%01.3f",
-    "%4f",
-    "%3.1f",
-    "%3.2f",
-    "%.0f",
-    "%.1f",
-    NULL
-  };
-  double fp_nums[] = { -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996, 
-    0.9996, 1.996, 4.136, 0};
-  char *int_fmt[] = {
-    "%-1.5d",
-    "%1.5d",
-    "%123.9d",
-    "%5.5d",
-    "%10.5d",
-    "% 10.5d",
-    "%+22.33d",
-    "%01.3d",
-    "%4d",
-    NULL
-  };
-  long int_nums[] = { -1, 134, 91340, 341, 0203, 0};
-  int x, y;
-  int fail = 0;
-  int num = 0;
-
-  printf ("Testing snprintf format codes against system sprintf...\n");
-
-  for (x = 0; fp_fmt[x] != NULL ; x++)
-    for (y = 0; fp_nums[y] != 0 ; y++)
-    {
-      snprintf (buf1, sizeof (buf1), fp_fmt[x], fp_nums[y]);
-      sprintf (buf2, fp_fmt[x], fp_nums[y]);
-      if (strcmp (buf1, buf2))
-      {
-       printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n", 
-           fp_fmt[x], buf1, buf2);
-       fail++;
-      }
-      num++;
-    }
-
-  for (x = 0; int_fmt[x] != NULL ; x++)
-    for (y = 0; int_nums[y] != 0 ; y++)
-    {
-      snprintf (buf1, sizeof (buf1), int_fmt[x], int_nums[y]);
-      sprintf (buf2, int_fmt[x], int_nums[y]);
-      if (strcmp (buf1, buf2))
-      {
-       printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n", 
-           int_fmt[x], buf1, buf2);
-       fail++;
-      }
-      num++;
-    }
-  printf ("%d tests failed out of %d.\n", fail, num);
-  return 0;
-}
-#endif /* TEST_SNPRINTF */
index 3819120d34a187c018a73a5028e6a17ecabb001a..d5cb693d9eb46d54da47ee9ce808b329c88a1144 100644 (file)
@@ -133,21 +133,13 @@ extern int asprintf(char **, const char *, ...)
 extern int vasprintf(char **, const char *, va_list)
     __attribute__((__format__(printf, 2, 0)));
 #endif
-#if !HAVE_DECL_SNPRINTF
-extern int snprintf(char *, size_t, const char *, ...)
-    __attribute__((__format__(printf, 3, 4)));
-#endif
-#if !HAVE_DECL_VSNPRINTF
-extern int vsnprintf(char *, size_t, const char *, va_list)
-    __attribute__((__format__(printf, 3, 0)));
-#endif
 #if !HAVE_ISSETUGID
 extern int issetugid(void);
 #endif
 #if !HAVE_MKSTEMP
 extern int mkstemp(char *);
 #endif
-#if !HAVE_REALLOCARRAY
+#if !HAVE_DECL_REALLOCARRAY
 extern void *reallocarray(void *, size_t, size_t);
 #endif
 #if !HAVE_STRNDUP
index 47b601e9a624c30a32c1aaf5891a1c6846c75e00..f9036b1569c45537ed7c7ad6c6b08e23cbaad21a 100644 (file)
@@ -41,7 +41,6 @@ pam-util/options        valgrind
 pam-util/vector         valgrind
 portable/asprintf       valgrind
 portable/mkstemp        valgrind
-portable/snprintf       valgrind
 portable/strndup        valgrind
 style/obsolete-strings
 valgrind/logs
index 442c431daba7e8b5dcebddb96ef40f2249de2963..00734778b256ed9664c339838b2104dbd13a3679 100644 (file)
@@ -8,7 +8,7 @@
 // with the --xml flag and then add a suppression for the error id, file
 // location, and line.
 //
-// Copyright 2018-2020 Russ Allbery <eagle@eyrie.org>
+// Copyright 2018-2021 Russ Allbery <eagle@eyrie.org>
 //
 // Copying and distribution of this file, with or without modification, are
 // permitted in any medium without royalty provided the copyright notice and
@@ -28,22 +28,34 @@ constArgument:tests/runtests.c:804
 // False positive due to recursive function.
 knownConditionTrueFalse:portable/getopt.c:146
 
+// Bug in cppcheck 2.3.  cppcheck can't see the assignment because of the
+// void * cast.
+knownConditionTrueFalse:portable/k_haspag.c:61
+
 // False positive since the string comes from a command-line define.
+knownConditionTrueFalse:tests/tap/process.c:415
 knownConditionTrueFalse:tests/tap/remctl.c:79
 
 // Stored in the returned ai struct, but cppcheck can't see the assignment
 // because of the struct sockaddr * cast.
 memleak:portable/getaddrinfo.c:236
 
-// Bug in cppcheck 1.89.  The address of this variable is passed to a Windows
-// function (albeit through a cast).
+// Bug in cppcheck 1.89 (fixed in 2.3).  The address of this variable is
+// passed to a Windows function (albeit through a cast).
 nullPointer:portable/winsock.c:61
 
+// Bug in cppcheck 2.3.
+nullPointerRedundantCheck:portable/krb5-profile.c:61
+
+// Bug in cppcheck 2.3.
+nullPointerRedundantCheck:portable/krb5-renew.c:82
+nullPointerRedundantCheck:portable/krb5-renew.c:83
+
 // Setting the variable to NULL explicitly after deallocation.
 redundantAssignment:tests/pam-util/options-t.c
 
-// (remctl) Bug in cppcheck 1.89.  The address of these variables are passed
-// to a PHP function.
+// (remctl) Bug in cppcheck 1.89 (fixed in 2.3).  The address of these
+// variables are passed to a PHP function.
 uninitvar:php/php_remctl.c:119
 uninitvar:php/php_remctl.c:123
 uninitvar:php/php_remctl.c:315
@@ -51,5 +63,10 @@ uninitvar:php/php5_remctl.c:125
 uninitvar:php/php5_remctl.c:129
 uninitvar:php/php5_remctl.c:321
 
+// (remctl) Bug in cppcheck 1.82.  A pointer to this array is stored in a
+// struct that's passed to another function.
+redundantAssignment:tests/server/acl-t.c
+
 // (pam-krb5) cppcheck doesn't recognize the unused attribute on labels.
 unusedLabel:module/auth.c:895
+unusedLabelConfiguration:module/auth.c:895
index 5c1005445f2605a2c95ecd4f1cb3f335af8d9f91..6e987803f5e28e73b5a300edfca2c33221aa53c3 100644 (file)
@@ -11,7 +11,7 @@
 # which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
 #
 # Written by Russ Allbery <eagle@eyrie.org>
-# Copyright 2017-2018 Russ Allbery <eagle@eyrie.org>
+# Copyright 2017-2018, 2020 Russ Allbery <eagle@eyrie.org>
 # Copyright 2011-2014
 #     The Board of Trustees of the Leland Stanford Junior University
 #
    fun:*alloc
    fun:_krb5_config_get_entry
 }
+{
+   heimdal-gss-cred
+   Memcheck:Leak
+   fun:calloc
+   obj:*libgssapi.so.*
+   obj:*libgssapi.so.*
+   fun:gss_acquire_cred
+}
 {
    heimdal-gss-krb5-init
    Memcheck:Leak
index d829080da1e7c9a39781e0f72b00070f24f984c9..db811a9bf903a62a89d131dd2bf6d4891c6ee601 100755 (executable)
@@ -31,7 +31,7 @@
 #
 # SPDX-License-Identifier: MIT
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
@@ -51,6 +51,8 @@ my @IGNORE = (
     qr{ \A (NEWS|THANKS|TODO) \z }xms,  # Package license should be fine
     qr{ \A README ( [.] .* )? \z }xms,  # Package license should be fine
     qr{ \A (Makefile|libtool) \z }xms,  # Generated file
+    qr{ [.] l?a \z }xms,                # Created by libtool
+    qr{ [.] o \z }xms,                  # Compiler objects
     qr{ [.] output \z }xms,             # Test data
 );
 my @IGNORE_PATHS = (
@@ -74,8 +76,7 @@ my @IGNORE_PATHS = (
     qr{ \A php/run-tests [.] php \z }xms,      # Created by phpize
     qr{ \A python/ .* [.] egg-info/ }xms,      # Python build files
     qr{ \A tests/config/ (?!README) }xms,      # Test configuration
-    qr{ [.] l?a \z }xms,                       # Created by libtool
-    qr{ [.] o \z }xms,                         # Compiler objects
+    qr{ \A tests/tmp/ }xms,                    # Temporary test files
 );
 ## use critic
 
diff --git a/tests/portable/snprintf-t.c b/tests/portable/snprintf-t.c
deleted file mode 100644 (file)
index d14712f..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * snprintf test suite.
- *
- * The canonical version of this file is maintained in the rra-c-util package,
- * which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
- *
- * Written by Russ Allbery <eagle@eyrie.org>
- * Copyright 2000-2006, 2018-2020 Russ Allbery <eagle@eyrie.org>
- * Copyright 2009-2010
- *     The Board of Trustees of the Leland Stanford Junior University
- * Copyright 1995 Patrick Powell
- * Copyright 2001 Hrvoje Niksic
- *
- * This code is based on code written by Patrick Powell (papowell@astart.com)
- * It may be used for any purpose as long as this notice remains intact
- * on all source code distributions
- *
- * There is no SPDX-License-Identifier registered for this license.
- */
-
-#include <config.h>
-#include <portable/system.h>
-
-#include <tests/tap/basic.h>
-
-/*
- * Disable the requirement that format strings be literals.  We need variable
- * formats for easy testing.
- */
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2) || defined(__clang__)
-#    pragma GCC diagnostic ignored "-Wformat-nonliteral"
-#endif
-
-/*
- * Intentionally don't add the printf attribute here since we pass a
- * zero-length printf format during testing and don't want warnings.
- */
-int test_snprintf(char *str, size_t count, const char *fmt, ...);
-int test_vsnprintf(char *str, size_t count, const char *fmt, va_list args);
-
-static const char string[] = "abcdefghijklmnopqrstuvwxyz0123456789";
-
-/* clang-format off */
-
-static const char *const fp_formats[] = {
-    "%-1.5f",   "%1.5f",    "%31.6f",   "%10.5f",   "% 10.5f",  "%+22.6f",
-    "%+4.6f",   "%01.3f",   "%3.1f",    "%3.2f",    "%.0f",     "%.1f",
-    "%f",
-    NULL
-};
-static const char *const int_formats[] = {
-    "%-1.5d",   "%1.5d",    "%31.9d",   "%5.5d",    "%10.5d",   "% 10.5d",
-    "%+22.30d", "%01.3d",   "%4d",      "%d",       "%ld",      NULL
-};
-static const char *const uint_formats[] = {
-    "%-1.5lu",  "%1.5lu",   "%31.9lu",  "%5.5lu",   "%10.5lu",  "% 10.5lu",
-    "%+6.30lu", "%01.3lu",  "%4lu",     "%lu",      "%4lx",     "%4lX",
-    "%01.3lx",  "%1lo",     NULL
-};
-static const char *const llong_formats[] = {
-    "%lld",     "%-1.5lld",  "%1.5lld",    "%123.9lld",  "%5.5lld",
-    "%10.5lld", "% 10.5lld", "%+22.33lld", "%01.3lld",   "%4lld",
-    NULL
-};
-static const char *const ullong_formats[] = {
-    "%llu",     "%-1.5llu",  "%1.5llu",    "%123.9llu",  "%5.5llu",
-    "%10.5llu", "% 10.5llu", "%+22.33llu", "%01.3llu",   "%4llu",
-    "%llx",     "%llo",      NULL
-};
-
-static const double fp_nums[] = {
-    -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996, 0.9996, 1.996,
-    4.136, 0.1, 0.01, 0.001, 10.1, 0
-};
-static long int_nums[] = {
-    -1, 134, 91340, 341, 0203, 0
-};
-static unsigned long uint_nums[] = {
-    (unsigned long) -1, 134, 91340, 341, 0203, 0
-};
-static long long llong_nums[] = {
-    ~(long long) 0,                     /* All-1 bit pattern. */
-    (~(unsigned long long) 0) >> 1,     /* Largest signed long long. */
-    -150, 134, 91340, 341,
-    0
-};
-static unsigned long long ullong_nums[] = {
-    ~(unsigned long long) 0,            /* All-1 bit pattern. */
-    (~(unsigned long long) 0) >> 1,     /* Largest signed long long. */
-    134, 91340, 341,
-    0
-};
-
-/* clang-format on */
-
-
-static void
-test_format(bool trunc, const char *expected, int count, const char *format,
-            ...)
-{
-    char buf[128];
-    int result;
-    va_list args;
-
-    va_start(args, format);
-    result = test_vsnprintf(buf, trunc ? 32 : sizeof(buf), format, args);
-    va_end(args);
-    is_string(expected, buf, "format %s, wanted %s", format, expected);
-    is_int(count, result, "...and output length correct");
-}
-
-
-int
-main(void)
-{
-    int i, count;
-    unsigned int j;
-    long lcount;
-    char lgbuf[128];
-
-    plan(8
-         + (18 + (ARRAY_SIZE(fp_formats) - 1) * ARRAY_SIZE(fp_nums)
-            + (ARRAY_SIZE(int_formats) - 1) * ARRAY_SIZE(int_nums)
-            + (ARRAY_SIZE(uint_formats) - 1) * ARRAY_SIZE(uint_nums)
-            + (ARRAY_SIZE(llong_formats) - 1) * ARRAY_SIZE(llong_nums)
-            + (ARRAY_SIZE(ullong_formats) - 1) * ARRAY_SIZE(ullong_nums))
-               * 2);
-
-    is_int(4, test_snprintf(NULL, 0, "%s", "abcd"), "simple string length");
-    is_int(2, test_snprintf(NULL, 0, "%d", 20), "number length");
-    is_int(7, test_snprintf(NULL, 0, "Test %.2s", "abcd"), "limited string");
-    is_int(1, test_snprintf(NULL, 0, "%c", 'a'), "character length");
-    is_int(0, test_snprintf(NULL, 0, ""), "empty format length");
-
-    test_format(true, "abcd", 4, "%s", "abcd");
-    test_format(true, "20", 2, "%d", 20);
-    test_format(true, "Test ab", 7, "Test %.2s", "abcd");
-    test_format(true, "a", 1, "%c", 'a');
-    test_format(true, "", 0, "");
-    test_format(true, "abcdefghijklmnopqrstuvwxyz01234", 36, "%s", string);
-    test_format(true, "abcdefghij", 10, "%.10s", string);
-    test_format(true, "  abcdefghij", 12, "%12.10s", string);
-    test_format(true, "    abcdefghijklmnopqrstuvwxyz0", 40, "%40s", string);
-    test_format(true, "abcdefghij    ", 14, "%-14.10s", string);
-    test_format(true, "              abcdefghijklmnopq", 50, "%50s", string);
-    test_format(true, "%abcd%", 6, "%%%0s%%", "abcd");
-    test_format(true, "", 0, "%.0s", string);
-    test_format(true, "abcdefghijklmnopqrstuvwxyz  444", 32, "%.26s  %d",
-                string, 4444);
-    test_format(true, "abcdefghijklmnopqrstuvwxyz  -2.", 32, "%.26s  %.1f",
-                string, -2.5);
-    test_format(true, "abcdefghij4444", 14, "%.10s%n%d", string, &count, 4444);
-    is_int(10, count, "correct output from %%n");
-    test_format(true, "abcdefghijklmnopqrstuvwxyz01234", 36, "%n%s%ln", &count,
-                string, &lcount);
-    is_int(0, count, "correct output from two %%n");
-    is_int(31, lcount, "correct output from long %%ln");
-    test_format(true, "(null)", 6, "%s", (char *) NULL);
-
-    for (i = 0; fp_formats[i] != NULL; i++)
-        for (j = 0; j < ARRAY_SIZE(fp_nums); j++) {
-            count = sprintf(lgbuf, fp_formats[i], fp_nums[j]);
-            test_format(false, lgbuf, count, fp_formats[i], fp_nums[j]);
-        }
-    for (i = 0; int_formats[i] != NULL; i++)
-        for (j = 0; j < ARRAY_SIZE(int_nums); j++) {
-            count = sprintf(lgbuf, int_formats[i], int_nums[j]);
-            test_format(false, lgbuf, count, int_formats[i], int_nums[j]);
-        }
-    for (i = 0; uint_formats[i] != NULL; i++)
-        for (j = 0; j < ARRAY_SIZE(uint_nums); j++) {
-            count = sprintf(lgbuf, uint_formats[i], uint_nums[j]);
-            test_format(false, lgbuf, count, uint_formats[i], uint_nums[j]);
-        }
-    for (i = 0; llong_formats[i] != NULL; i++)
-        for (j = 0; j < ARRAY_SIZE(llong_nums); j++) {
-            count = sprintf(lgbuf, llong_formats[i], llong_nums[j]);
-            test_format(false, lgbuf, count, llong_formats[i], llong_nums[j]);
-        }
-    for (i = 0; ullong_formats[i] != NULL; i++)
-        for (j = 0; j < ARRAY_SIZE(ullong_nums); j++) {
-            count = sprintf(lgbuf, ullong_formats[i], ullong_nums[j]);
-            test_format(false, lgbuf, count, ullong_formats[i],
-                        ullong_nums[j]);
-        }
-
-    return 0;
-}
diff --git a/tests/portable/snprintf.c b/tests/portable/snprintf.c
deleted file mode 100644 (file)
index cff95b3..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#define TESTING 1
-#include <portable/snprintf.c>
index 4f033f81bbb502acbe8b53fed04101bfdce167f9..1050120c7f084405b20ad02d584f1b1440a2ffcd 100644 (file)
@@ -387,6 +387,9 @@ x_malloc(size_t size, const char *file, int line)
 static void *
 x_reallocarray(void *p, size_t n, size_t size, const char *file, int line)
 {
+    n = (n > 0) ? n : 1;
+    size = (size > 0) ? size : 1;
+
     if (n > 0 && UINT_MAX / n <= size)
         sysdie("realloc too large at %s line %d", file, line);
     p = realloc(p, n * size);
index 02fd30c9bfc98ea014c84b4f4c2ac1c9aa503822..430f07219cef31b75028405e92d691e5505c202c 100755 (executable)
@@ -9,7 +9,7 @@
 # The canonical version of this file is maintained in the rra-c-util package,
 # which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
 #
-# Copyright 2016, 2018-2019 Russ Allbery <eagle@eyrie.org>
+# Copyright 2016, 2018-2020 Russ Allbery <eagle@eyrie.org>
 #
 # Permission is hereby granted, free of charge, to any person obtaining a
 # copy of this software and associated documentation files (the "Software"),
@@ -31,7 +31,7 @@
 #
 # SPDX-License-Identifier: MIT
 
-use 5.008;
+use 5.010;
 use strict;
 use warnings;
 
@@ -48,7 +48,8 @@ my @BAD_REGEXES = (qr{ http:// \S+ [.]eyrie[.]org }xms);
 my @BAD_STRINGS = qw(rra@stanford.edu RRA_MAINTAINER_TESTS);
 
 # File names to exclude from this check.
-my %EXCLUDE = map { $_ => 1 } qw(NEWS obsolete-strings.t obsolete-strings-t);
+my %EXCLUDE
+  = map { $_ => 1 } qw(NEWS changelog obsolete-strings.t obsolete-strings-t);
 
 # Only run this test for the package author, since it doesn't indicate any
 # user-noticable flaw in the package itself.
index cd106d03e272cbcfb59eae8550e21489347d7715..b4ed42bf2c5d26b637adddbf07feaf6e2e8bd114 100644 (file)
@@ -52,7 +52,7 @@ BEGIN {
     # This version should match the corresponding rra-c-util release, but with
     # two digits for the minor version, including a leading zero if necessary,
     # so that it will sort properly.
-    $VERSION = '8.02';
+    $VERSION = '9.00';
 }
 
 # Compare a string to the contents of a file, similar to the standard is()
index 16c9b0153dbe502970196d1e7ef46aee5a23de94..78db9f406665615715ca49916cd15ea8546f30dc 100644 (file)
@@ -65,7 +65,7 @@ BEGIN {
     # This version should match the corresponding rra-c-util release, but with
     # two digits for the minor version, including a leading zero if necessary,
     # so that it will sort properly.
-    $VERSION = '8.02';
+    $VERSION = '9.00';
 }
 
 # Directories to skip globally when looking for all files, or for directories
@@ -107,7 +107,7 @@ sub all_files {
             $File::Find::prune = 1;
             return;
         }
-        if (-f $file) {
+        if (!-d $file) {
             push(@files, $path);
         }
     };
@@ -270,7 +270,7 @@ sub test_file_path {
   BASE:
     for my $base ($ENV{C_TAP_BUILD}, $ENV{C_TAP_SOURCE}) {
         next if !defined($base);
-        if (-f "$base/$file") {
+        if (-e "$base/$file") {
             return "$base/$file";
         }
     }
@@ -448,7 +448,7 @@ Russ Allbery <eagle@eyrie.org>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2014-2015, 2018-2020 Russ Allbery <eagle@eyrie.org>
+Copyright 2014-2015, 2018-2021 Russ Allbery <eagle@eyrie.org>
 
 Copyright 2013 The Board of Trustees of the Leland Stanford Junior University
 
index 70641405c6cd15352a5057e56a2d066ce9b97960..557c6823924913c7a27b886cbaf4cb4f7553b8e5 100644 (file)
@@ -32,7 +32,7 @@ BEGIN {
     # This version should match the corresponding rra-c-util release, but with
     # two digits for the minor version, including a leading zero if necessary,
     # so that it will sort properly.
-    $VERSION = '8.02';
+    $VERSION = '9.00';
 }
 
 # If C_TAP_BUILD or C_TAP_SOURCE are set in the environment, look for