diff options
author | Damien Miller <djm@mindrot.org> | 2000-07-01 16:52:55 +1000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2000-07-01 16:52:55 +1000 |
commit | cb170cb225e62f6deda4911f0fbab2d6cd6b8062 (patch) | |
tree | 003880eaf4ddfda40e01a1baee5f2d85f69e2704 | |
parent | 28adeef966d890b5831d831b1f0e1100c9db5b0a (diff) |
- (djm) Added check for broken snprintf() functions which do not correctly
terminate output string and attempt to use replacement.
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | acconfig.h | 3 | ||||
-rw-r--r-- | bsd-snprintf.c | 12 | ||||
-rw-r--r-- | configure.in | 17 |
4 files changed, 28 insertions, 6 deletions
@@ -4,6 +4,8 @@ - (djm) Replace "/bin/sh" with _PATH_BSHELL. Report from Corinna Vinschen <vinschen@cygnus.com> - (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 @@ -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 c31fc38d..ff26a104 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 <sys/param.h> #include <sys/types.h> @@ -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 8e155f26..dbc5a18e 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 <stdio.h> +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 ], |