]> Savannah Git Hosting - gnulib.git/commitdiff
ptsname: reject invalid file descriptors
authorEric Blake <eblake@redhat.com>
Tue, 2 Oct 2012 18:22:19 +0000 (12:22 -0600)
committerEric Blake <eblake@redhat.com>
Tue, 2 Oct 2012 18:28:25 +0000 (12:28 -0600)
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.

ChangeLog
doc/posix-functions/ptsname.texi
lib/stdlib.in.h
m4/ptsname.m4
m4/stdlib_h.m4
modules/ptsname
modules/stdlib

index 741c48d1905fae6fcd7a259019b5a41423c4eb02..c27db0d79d31dbd61cc3a7ea53f722dca4c8b13b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index c19ad4fe0e032e3aec45ccfc5a60e3421302cd10..f145aed335b36a362abb508eceb4026ce4be19c7 100644 (file)
@@ -11,6 +11,9 @@ Portability problems fixed by Gnulib:
 @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:
index 1d67ec64c663517a86d3992ed6f29cc8d39881bd..8311a2893c8ac086c1db71eafd921c7d9c899676 100644 (file)
@@ -457,10 +457,19 @@ _GL_WARN_ON_USE (posix_openpt, "posix_openpt is not portable - "
 #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
+#  endif
 _GL_CXXALIAS_SYS (ptsname, char *, (int fd));
+# endif
 _GL_CXXALIASWARN (ptsname);
 #elif defined GNULIB_POSIXCHECK
 # undef ptsname
index ab105be48f059f2a8c767a966098e3e6e1eae41f..08c9c94d29cdbbe7be51656a277df21f4081f66f 100644 (file)
@@ -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_DEFUN([gl_FUNC_PTSNAME],
   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
 ])
 
index ab43728ace41a4ce331571421396fbbe8ce867cb..9c69f2e4d15f0fcdef3c24f6797f4bcfa6def1ea 100644 (file)
@@ -102,6 +102,7 @@ AC_DEFUN([gl_STDLIB_H_DEFAULTS],
   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])
index f0ce25600dd6bf98d12c9ca3fbb1210eb295df8f..2f679662af6162ed9c4f1a8f0ac185fc932a1f60 100644 (file)
@@ -12,7 +12,7 @@ ptsname_r       [test $HAVE_PTSNAME = 0]
 
 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
index f967ef63ff647ed7767b7a575a3a0d2a09e21bbc..8164477be07010e9fc519368f5b58d8928f79647 100644 (file)
@@ -95,6 +95,7 @@ stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
              -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' \