changeset 17121:4e2101c3d42c

ptsname: reject invalid file descriptors POSIX left errno undefined on ptsname() failure, although there has at least been an effort to specify reasonable values to use: http://www.austingroupbugs.net/view.php?id=503 However, our tests for ptsname and ptsname_r already require errno to be set to useful values (as in glibc), so it is worth replacing ptsname on FreeBSD 8.2 in order to get better QoI and pass the test. * m4/ptsname.m4 (gl_FUNC_PTSNAME): Probe for FreeBSD bug. * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Add new witness. * modules/stdlib (Makefile.am): Replace witness. * lib/stdlib.in.h (ptsname): Allow for replacement. * modules/ptsname (configure.ac): Trigger replacement. * doc/posix-functions/ptsname.texi (ptsname): Document this.
author Eric Blake <eblake@redhat.com>
date Tue, 02 Oct 2012 12:22:19 -0600
parents ac32fde6df85
children 134fbc73d583
files ChangeLog doc/posix-functions/ptsname.texi lib/stdlib.in.h m4/ptsname.m4 m4/stdlib_h.m4 modules/ptsname modules/stdlib
diffstat 7 files changed, 49 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Thu Sep 27 08:42:07 2012 +0200
+++ b/ChangeLog	Tue Oct 02 12:22:19 2012 -0600
@@ -1,3 +1,14 @@
+2012-10-02  Eric Blake  <eblake@redhat.com>
+
+	ptsname: reject invalid file descriptors
+	http://www.austingroupbugs.net/view.php?id=503
+	* m4/ptsname.m4 (gl_FUNC_PTSNAME): Probe for FreeBSD bug.
+	* m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Add new witness.
+	* modules/stdlib (Makefile.am): Replace witness.
+	* lib/stdlib.in.h (ptsname): Allow for replacement.
+	* modules/ptsname (configure.ac): Trigger replacement.
+	* doc/posix-functions/ptsname.texi (ptsname): Document this.
+
 2012-10-02:  Nikos Mavrogiannopoulos  <nmav@gnutls.org>  (tiny change)
 
 	hash-pjw-bare: new module
--- a/doc/posix-functions/ptsname.texi	Thu Sep 27 08:42:07 2012 +0200
+++ b/doc/posix-functions/ptsname.texi	Tue Oct 02 12:22:19 2012 -0600
@@ -11,6 +11,9 @@
 @item
 This function is missing on some platforms:
 Mac OS X 10.3, OpenBSD 3.8, Minix 3.1.8, mingw, MSVC 9, BeOS.
+@item
+This function fails to set errno on failure on some platforms:
+FreeBSD 8.2.
 @end itemize
 
 Portability problems not fixed by Gnulib:
--- a/lib/stdlib.in.h	Thu Sep 27 08:42:07 2012 +0200
+++ b/lib/stdlib.in.h	Tue Oct 02 12:22:19 2012 -0600
@@ -457,10 +457,19 @@
 #if @GNULIB_PTSNAME@
 /* Return the pathname of the pseudo-terminal slave associated with
    the master FD is open on, or NULL on errors.  */
-# if !@HAVE_PTSNAME@
+# if @REPLACE_PTSNAME@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPCE)
+#   undef ptsname
+#   define ptsname rpl_ptsname
+#  endif
+_GL_FUNCDECL_RPL (ptsname, char *, (int fd));
+_GL_CXXALIAS_RPL (ptsname, char *, (int fd));
+# else
+#  if !@HAVE_PTSNAME@
 _GL_FUNCDECL_SYS (ptsname, char *, (int fd));
+#  endif
+_GL_CXXALIAS_SYS (ptsname, char *, (int fd));
 # endif
-_GL_CXXALIAS_SYS (ptsname, char *, (int fd));
 _GL_CXXALIASWARN (ptsname);
 #elif defined GNULIB_POSIXCHECK
 # undef ptsname
--- a/m4/ptsname.m4	Thu Sep 27 08:42:07 2012 +0200
+++ b/m4/ptsname.m4	Tue Oct 02 12:22:19 2012 -0600
@@ -1,4 +1,4 @@
-# ptsname.m4 serial 2
+# ptsname.m4 serial 3
 dnl Copyright (C) 2010-2012 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -14,6 +14,26 @@
   AC_CHECK_FUNCS([ptsname])
   if test $ac_cv_func_ptsname = no; then
     HAVE_PTSNAME=0
+  else
+    AC_CACHE_CHECK([whether ptsname sets errno on failure],
+      [gl_cv_func_ptsname_sets_errno],
+      [AC_RUN_IFELSE(
+         [AC_LANG_PROGRAM([[#include <errno.h>
+      ]], [[
+      return ptsname (-1) || !errno;
+           ]])],
+         [gl_cv_func_ptsname_sets_errno=yes],
+         [gl_cv_func_ptsname_sets_errno=no],
+         [case "$host_os" in
+                    # Guess yes on glibc systems.
+            *-gnu*) gl_cv_func_ptsname_sets_errno="guessing yes" ;;
+                    # If we don't know, assume the worst.
+            *)      gl_cv_func_ptsname_sets_errno="guessing no" ;;
+          esac
+         ])])
+    case $gl_cv_func_ptsname_sets_errno in
+      *no) REPLACE_PTSNAME=1 ;;
+    esac
   fi
 ])
 
--- a/m4/stdlib_h.m4	Thu Sep 27 08:42:07 2012 +0200
+++ b/m4/stdlib_h.m4	Tue Oct 02 12:22:19 2012 -0600
@@ -102,6 +102,7 @@
   REPLACE_MALLOC=0;          AC_SUBST([REPLACE_MALLOC])
   REPLACE_MBTOWC=0;          AC_SUBST([REPLACE_MBTOWC])
   REPLACE_MKSTEMP=0;         AC_SUBST([REPLACE_MKSTEMP])
+  REPLACE_PTSNAME=0;         AC_SUBST([REPLACE_PTSNAME])
   REPLACE_PTSNAME_R=0;       AC_SUBST([REPLACE_PTSNAME_R])
   REPLACE_PUTENV=0;          AC_SUBST([REPLACE_PUTENV])
   REPLACE_RANDOM_R=0;        AC_SUBST([REPLACE_RANDOM_R])
--- a/modules/ptsname	Thu Sep 27 08:42:07 2012 +0200
+++ b/modules/ptsname	Tue Oct 02 12:22:19 2012 -0600
@@ -12,7 +12,7 @@
 
 configure.ac:
 gl_FUNC_PTSNAME
-if test $HAVE_PTSNAME = 0; then
+if test $HAVE_PTSNAME = 0 || test $REPLACE_PTSNAME = 1; then
   AC_LIBOBJ([ptsname])
   gl_PREREQ_PTSNAME
 fi
--- a/modules/stdlib	Thu Sep 27 08:42:07 2012 +0200
+++ b/modules/stdlib	Tue Oct 02 12:22:19 2012 -0600
@@ -95,6 +95,7 @@
 	      -e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \
 	      -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \
 	      -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+	      -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \
 	      -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \
 	      -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
 	      -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \