- (djm) Added check for broken snprintf() functions which do not correctly
   terminate output string and attempt to use replacement.
diff --git a/ChangeLog b/ChangeLog
index 1bbdff7..b7c566b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/acconfig.h b/acconfig.h
index f10370d..b011d04 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 c31fc38..ff26a10 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 @@
 	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 @@
 	(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 @@
 	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 8e155f2..dbc5a18 100644
--- a/configure.in
+++ b/configure.in
@@ -235,6 +235,23 @@
 	[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 ],