[Top][All Lists]
[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>
- new module 'fdopen', Bruno Haible, 2011/09/21
- fdopen on MSVC,
Bruno Haible <=
- Re: fdopen on MSVC, Paolo Bonzini, 2011/09/26
- Re: fdopen on MSVC, Bruno Haible, 2011/09/26
- Re: fdopen on MSVC, Eric Blake, 2011/09/26
- Re: fdopen on MSVC, Eric Blake, 2011/09/26
- Re: fdopen on MSVC, Bruno Haible, 2011/09/26
- Re: fdopen on MSVC, Eric Blake, 2011/09/26