bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

fdopen on MSVC


From: Bruno Haible
Subject: fdopen on MSVC
Date: Sat, 24 Sep 2011 18:11:08 +0200
User-agent: KMail/1.13.6 (Linux/2.6.37.6-0.5-desktop; KDE/4.6.0; x86_64; ; )

The fdopen() function also crashes on MSVC if the fd argument is invalid.
Here's the workaround.


2011-09-24  Bruno Haible  <address@hidden>

        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.
address@hidden
 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>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]