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);