The fdopen() function also crashes on MSVC if the fd argument is invalid. Here's the workaround.
2011-09-24 Bruno Haible <br...@clisp.org> fdopen: Support for MSVC 9. * m4/fdopen.m4 (gl_FUNC_FDOPEN): Set REPLACE_FDOPEN also if HAVE_MSVC_INVALID_PARAMETER_HANDLER is 1. * lib/fdopen.c: Include msvc-inval.h. (fdopen_nothrow): New function. (rpl_fdopen): Use it. * modules/fdopen (Depends-on): Add msvc-inval. * modules/fclose-tests (Depends-on): Add fdopen. * modules/fflush-tests (Depends-on): Likewise. * modules/fgetc-tests (Depends-on): Likewise. * modules/fputc-tests (Depends-on): Likewise. * modules/fread-tests (Depends-on): Likewise. * modules/freopen-tests (Depends-on): Likewise. * modules/fseeko-tests (Depends-on): Likewise. * modules/ftello-tests (Depends-on): Likewise. * modules/fwrite-tests (Depends-on): Likewise. * doc/posix-functions/fdopen.texi: Mention the problem on MSVC. --- doc/posix-functions/fdopen.texi.orig Sat Sep 24 18:04:13 2011 +++ doc/posix-functions/fdopen.texi Sat Sep 24 18:01:35 2011 @@ -9,6 +9,9 @@ Portability problems fixed by Gnulib: @itemize @item +This function crashes when invoked with invalid arguments on some platforms: +MSVC 9. +@item On Windows platforms (excluding Cygwin), this function does not set @code{errno} upon failure. @end itemize --- lib/fdopen.c.orig Sat Sep 24 18:04:13 2011 +++ lib/fdopen.c Sat Sep 24 18:01:35 2011 @@ -21,8 +21,34 @@ #include <errno.h> +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +# include "msvc-inval.h" +#endif + #undef fdopen +#if HAVE_MSVC_INVALID_PARAMETER_HANDLER +static FILE * +fdopen_nothrow (int fd, const char *mode) +{ + FILE *result; + + TRY_MSVC_INVAL + { + result = fdopen (fd, mode); + } + CATCH_MSVC_INVAL + { + result = NULL; + } + DONE_MSVC_INVAL; + + return result; +} +#else +# define fdopen_nothrow fdopen +#endif + FILE * rpl_fdopen (int fd, const char *mode) { @@ -30,7 +56,7 @@ FILE *fp; errno = 0; - fp = fdopen (fd, mode); + fp = fdopen_nothrow (fd, mode); if (fp == NULL) { if (errno == 0) --- m4/fdopen.m4.orig Sat Sep 24 18:04:13 2011 +++ m4/fdopen.m4 Sat Sep 24 18:01:35 2011 @@ -1,4 +1,4 @@ -# fdopen.m4 serial 1 +# fdopen.m4 serial 2 dnl Copyright (C) 2011 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -8,12 +8,15 @@ [ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles - - dnl Test whether fdopen() sets errno when it fails due to a bad fd argument. - AC_CACHE_CHECK([whether fdopen sets errno], [gl_cv_func_fdopen_works], - [ - AC_RUN_IFELSE( - [AC_LANG_SOURCE([[ + AC_REQUIRE([gl_MSVC_INVAL]) + if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then + REPLACE_FDOPEN=1 + else + dnl Test whether fdopen() sets errno when it fails due to a bad fd argument. + AC_CACHE_CHECK([whether fdopen sets errno], [gl_cv_func_fdopen_works], + [ + AC_RUN_IFELSE( + [AC_LANG_SOURCE([[ #include <stdio.h> #include <errno.h> int @@ -28,17 +31,18 @@ return 2; return 0; }]])], - [gl_cv_func_fdopen_works=yes], - [gl_cv_func_fdopen_works=no], - [case "$host_os" in - mingw*) gl_cv_func_fdopen_works="guessing no" ;; - *) gl_cv_func_fdopen_works="guessing yes" ;; - esac - ]) - ]) - case "$gl_cv_func_fdopen_works" in - *no) REPLACE_FDOPEN=1 ;; - esac + [gl_cv_func_fdopen_works=yes], + [gl_cv_func_fdopen_works=no], + [case "$host_os" in + mingw*) gl_cv_func_fdopen_works="guessing no" ;; + *) gl_cv_func_fdopen_works="guessing yes" ;; + esac + ]) + ]) + case "$gl_cv_func_fdopen_works" in + *no) REPLACE_FDOPEN=1 ;; + esac + fi ]) dnl Prerequisites of lib/fdopen.c. --- modules/fclose-tests.orig Sat Sep 24 18:04:13 2011 +++ modules/fclose-tests Sat Sep 24 18:01:35 2011 @@ -2,6 +2,7 @@ tests/test-fclose.c Depends-on: +fdopen configure.ac: --- modules/fdopen.orig Sat Sep 24 18:04:13 2011 +++ modules/fdopen Sat Sep 24 18:01:35 2011 @@ -7,6 +7,7 @@ Depends-on: stdio +msvc-inval [test $REPLACE_FDOPEN = 1] configure.ac: gl_FUNC_FDOPEN --- modules/fflush-tests.orig Sat Sep 24 18:04:13 2011 +++ modules/fflush-tests Sat Sep 24 18:01:35 2011 @@ -7,6 +7,7 @@ Depends-on: binary-io +fdopen fseeko configure.ac: --- modules/fgetc-tests.orig Sat Sep 24 18:04:13 2011 +++ modules/fgetc-tests Sat Sep 24 18:01:48 2011 @@ -5,6 +5,7 @@ Depends-on: unistd +fdopen configure.ac: --- modules/fputc-tests.orig Sat Sep 24 18:04:13 2011 +++ modules/fputc-tests Sat Sep 24 18:01:53 2011 @@ -5,6 +5,7 @@ Depends-on: unistd +fdopen configure.ac: --- modules/fread-tests.orig Sat Sep 24 18:04:13 2011 +++ modules/fread-tests Sat Sep 24 18:01:57 2011 @@ -5,6 +5,7 @@ Depends-on: unistd +fdopen configure.ac: --- modules/freopen-tests.orig Sat Sep 24 18:04:13 2011 +++ modules/freopen-tests Sat Sep 24 18:01:35 2011 @@ -4,6 +4,7 @@ tests/macros.h Depends-on: +fdopen configure.ac: --- modules/fseeko-tests.orig Sat Sep 24 18:04:13 2011 +++ modules/fseeko-tests Sat Sep 24 18:01:35 2011 @@ -11,6 +11,7 @@ m4/ungetc.m4 Depends-on: +fdopen configure.ac: gl_FUNC_UNGETC_WORKS --- modules/ftello-tests.orig Sat Sep 24 18:04:13 2011 +++ modules/ftello-tests Sat Sep 24 18:01:35 2011 @@ -11,6 +11,7 @@ Depends-on: binary-io +fdopen configure.ac: gl_FUNC_UNGETC_WORKS --- modules/fwrite-tests.orig Sat Sep 24 18:04:13 2011 +++ modules/fwrite-tests Sat Sep 24 18:02:03 2011 @@ -5,6 +5,7 @@ Depends-on: unistd +fdopen configure.ac: -- In memoriam Sara Harpman <http://www.genealogieonline.nl/en/stamboom-harpman/I399.php>