From cb170cb225e62f6deda4911f0fbab2d6cd6b8062 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Sat, 1 Jul 2000 16:52:55 +1000 Subject: - (djm) Added check for broken snprintf() functions which do not correctly terminate output string and attempt to use replacement. --- ChangeLog | 2 ++ acconfig.h | 3 +++ bsd-snprintf.c | 12 ++++++------ configure.in | 17 +++++++++++++++++ 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1bbdff7b6..b7c566bbc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,8 @@ - (djm) Replace "/bin/sh" with _PATH_BSHELL. Report from Corinna Vinschen - (djm) Replace "/usr/bin/login" with LOGIN_PROGRAM + - (djm) Added check for broken snprintf() functions which do not correctly + terminate output string and attempt to use replacement. 20000628 - (djm) Fixes to lastlog code for Irix diff --git a/acconfig.h b/acconfig.h index f10370df4..b011d0421 100644 --- a/acconfig.h +++ b/acconfig.h @@ -6,6 +6,9 @@ @TOP@ +/* Define if your snprintf is busted */ +#undef BROKEN_SNPRINTF + /* Define if you are on NeXT */ #undef HAVE_NEXT diff --git a/bsd-snprintf.c b/bsd-snprintf.c index c31fc38d6..ff26a1048 100644 --- a/bsd-snprintf.c +++ b/bsd-snprintf.c @@ -26,7 +26,7 @@ #include "config.h" -#if !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF) +#if defined(BROKEN_SNPRINTF) || !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF) #include #include @@ -120,7 +120,7 @@ mcleanup(str, n, p) free(curobj); } -#if !defined(HAVE_VSNPRINTF) +#if !defined(HAVE_VSNPRINTF) || defined(BROKEN_SNPRINTF) int vsnprintf(str, n, fmt, ap) char *str; @@ -152,9 +152,9 @@ vsnprintf(str, n, fmt, ap) (void) sigaction(SIGSEGV, &osa, NULL); return (ret); } -#endif /* !defined(HAVE_VSNPRINTF) */ +#endif /* !defined(HAVE_VSNPRINTF) || defined(BROKEN_SNPRINTF) */ -#if !defined(HAVE_SNPRINTF) +#if !defined(HAVE_SNPRINTF) || defined(BROKEN_SNPRINTF) int #if __STDC__ snprintf(char *str, size_t n, char const *fmt, ...) @@ -176,6 +176,6 @@ snprintf(str, n, fmt, va_alist) return (vsnprintf(str, n, fmt, ap)); va_end(ap); } -#endif /* !defined(HAVE_SNPRINTF) */ +#endif /* !defined(HAVE_SNPRINTF) || defined(BROKEN_SNPRINTF) */ -#endif /* !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF) */ +#endif /* defined(BROKEN_SNPRINTF) || !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF) */ diff --git a/configure.in b/configure.in index 8e155f26b..dbc5a18ee 100644 --- a/configure.in +++ b/configure.in @@ -235,6 +235,23 @@ AC_CHECK_FUNC(getpagesize, [AC_CHECK_LIB(ucb, getpagesize, [LIBS="$LIBS -lucb"; AC_DEFINE(HAVE_GETPAGESIZE)])] ) +# Check for broken snprintf +if test "x$ac_cv_func_snprintf" = "xyes" ; then + AC_MSG_CHECKING([whether snprintf correctly terminates long strings]) + AC_TRY_RUN( + [ +#include +int main(void){char b[5];snprintf(b,5,"123456789");return(b[4]!='\0');} + ], + [AC_MSG_RESULT(yes)], + [ + AC_MSG_RESULT(no) + AC_DEFINE(BROKEN_SNPRINTF) + AC_MSG_WARN([****** Your snprintf() function is broken, complain to your vendor]) + ] + ) +fi + PAM_MSG="no" AC_ARG_WITH(pam, [ --without-pam Disable PAM support ], -- cgit v1.2.3