diff --git a/src/modules/files/configure.in b/src/modules/files/configure.in
index 4f30d6e5a97f8bc028667a6e8d437ff091e24821..12fb1ea13335e0b3718afe890aa98406467fb0a7 100644
--- a/src/modules/files/configure.in
+++ b/src/modules/files/configure.in
@@ -13,6 +13,30 @@ AC_CHECK_LIB(nsl, gethostbyname)
 
 AC_HAVE_FUNCS(socketpair getwd strerror)
 
+AC_MSG_CHECKING(for working (and failsafe) strerror)
+AC_CACHE_VAL(pike_cv_failsafe_strerror)
+[
+AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+int main()
+{
+  int e;
+  char *s;
+  for(e=0;e<256;e++) if(sterror(e)) if(strerror(e)[0]=='\b') exit(1);
+  exit(0);
+}
+],pike_cv_failsafe_strerror=yes,pike_cv_failsafe_strerror=no)
+])
+
+if test "$pike_cv_failsafe_streror" = yes; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(HAVE_STRERROR)
+else
+  AC_MSG_RESULT(no)
+fi
+
+
 AC_MSG_CHECKING(size of socket buffers)
 AC_CACHE_VAL(pike_cv_socket_buffer_max,
 [
diff --git a/src/modules/files/efuns.c b/src/modules/files/efuns.c
index 064ee8e835a04eb412c24be2de911c189370a2a6..338d88e80bdd59cbd19102eb4e42e4b2ad8aecce 100644
--- a/src/modules/files/efuns.c
+++ b/src/modules/files/efuns.c
@@ -15,7 +15,9 @@
 
 #include "file_machine.h"
 
+#ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
+#endif
 #include <sys/stat.h>
 #include <sys/param.h>
 #include <signal.h>
@@ -352,7 +354,10 @@ void f_strerror(INT32 args)
   if(sp[-args].type != T_INT)
     error("Bad argument 1 to strerror()\n");
 
-  s=strerror(sp[-args].u.integer);
+  if(sp[-args].u.integer < 0 || sp[-args].u.integer > 256 )
+    s=0;
+  else
+    s=strerror(sp[-args].u.integer);
   pop_n_elems(args);
   if(s)
     push_text(s);