* doc/glibc-headers/gshadow.texi: New file.
* doc/glibc-functions/endsgent.texi: New file.
* doc/glibc-functions/fgetsgent.texi: New file.
* doc/glibc-functions/fgetsgent_r.texi: New file.
* doc/glibc-functions/getsgent.texi: New file.
* doc/glibc-functions/getsgent_r.texi: New file.
* doc/glibc-functions/getsgnam.texi: New file.
* doc/glibc-functions/getsgnam_r.texi: New file.
* doc/glibc-functions/putsgent.texi: New file.
* doc/glibc-functions/setsgent.texi: New file.
* doc/glibc-functions/sgetsgent.texi: New file.
* doc/glibc-functions/sgetsgent_r.texi: New file.
* doc/glibc-functions/malloc_info.texi: New file.
* doc/glibc-functions/preadv.texi: New file.
* doc/glibc-functions/pwritev.texi: New file.
* doc/glibc-functions/register_printf_modifier.texi: New file.
* doc/glibc-functions/register_printf_specifier.texi: New file.
* doc/glibc-functions/register_printf_type.texi: New file.
* doc/glibc-functions/pthread_attr_getaffinity_np.texi: New file.
* doc/glibc-functions/pthread_attr_setaffinity_np.texi: New file.
* doc/glibc-functions/pthread_getaffinity_np.texi: New file.
* doc/glibc-functions/pthread_getname_np.texi: New file.
* doc/glibc-functions/pthread_mutex_consistent_np.texi: New file.
* doc/glibc-functions/pthread_mutexattr_getrobust_np.texi: New file.
* doc/glibc-functions/pthread_mutexattr_setrobust_np.texi: New file.
* doc/glibc-functions/pthread_setaffinity_np.texi: New file.
* doc/glibc-functions/pthread_setname_np.texi: New file.
* doc/glibc-functions/pthread_sigqueue.texi: New file.
* doc/glibc-functions/pthread_timedjoin_np.texi: New file.
* doc/glibc-functions/pthread_tryjoin_np.texi: New file.
* doc/glibc-functions/qsort_r.texi: New file.
* doc/glibc-functions/quick_exit.texi: New file.
* doc/glibc-functions/syncfs.texi: New file.
* doc/gnulib.texi: Include them.
(Glibc gshadow.h, Glibc sys/uio.h): New sections.
* doc/posix-functions/psiginfo.texi: Fix info about glibc version.
* doc/posix-functions/pthread_mutex_consistent.texi: Likewise.
* doc/posix-functions/pthread_mutexattr_getrobust.texi: Likewise.
* doc/posix-functions/pthread_mutexattr_setrobust.texi: Likewise.
* doc/glibc-functions/execvpe.texi: Likewise.
* m4/timer_time.m4: Check for the POSIX function.
* modules/timer-time: Add the new module.
* MODULES.html.sh (Compat checks for POSIX:2008 functions):
Mention it.
* doc/posix-functions/timer_create.texi: Add timer-time as
the module, and update the platforms where unavailable.
* doc/posix-functions/timer_delete.texi: Likewise.
* doc/posix-functions/timer_gettime.texi: Likewise.
* doc/posix-functions/timer_settime.texi: Likewise.
Signed-off-by: Pádraig Brady <P@draigBrady.com>
* m4/pthread_sigmask.m4 (gl_FUNC_PTHREAD_SIGMASK): Test for the IRIX
bug.
* lib/pthread_sigmask.c (pthread_sigmask): usleep for some time when
there may be unblocked pending signals.
* doc/posix-functions/pthread_sigmask.texi: Mention the IRIX bug.
* m4/pthread_sigmask.m4 (gl_FUNC_PTHREAD_SIGMASK): Test for the Cygwin
bug.
* lib/pthread_sigmask.c (pthread_sigmask): Fix the return value from
the system's pthread_sigmask function.
* doc/posix-functions/pthread_sigmask.texi: Mention the Cygwin bug.
* m4/pthread_sigmask.m4 (gl_FUNC_PTHREAD_SIGMASK): Test for the
FreeBSD, HP-UX, Solaris bug.
(gl_PREREQ_PTHREAD_SIGMASK): New macro.
* lib/pthread_sigmask.c: Include <stddef.h>.
(pthread_sigmask): If HAVE_PTHREAD_SIGMASK, define as a wrapper around
the system's pthread_sigmask function.
* modules/pthread_sigmask (configure.ac): Invoke
gl_PREREQ_PTHREAD_SIGMASK.
* doc/posix-functions/pthread_sigmask.texi: Mention bug on FreeBSD,
HP-UX, Solaris.
Use of "W;" in an option string may be rare, but we might as well
avoid crashing on it.
* m4/getopt.m4 (gl_GETOPT_CHECK_HEADRS): Detect the problem.
* tests/test-getopt.h (test_getopt): Enhance test.
* tests/test-getopt_long.h (test_getopt_long): Likewise.
* doc/posix-functions/getopt.texi (getopt): Document it.
* doc/glibc-functions/getopt_long.texi (getopt_long): Likewise.
* doc/glibc-functions/getopt_long_only.texi (getopt_long_only):
Likewise.
Signed-off-by: Eric Blake <eblake@redhat.com>
* MODULES.html.sh (Support for systems lacking POSIX:2008): Add it.
* doc/posix-functions/pthread_sigmask.texi: Document new module.
* lib/signal.in.h (pthread_sigmask): Arrange for replacement.
This is done only as a macro; I don't know how well that'll
work for C++. Move <sys/types.h> include before the include_next,
to avoid mishap on Solaris.
* m4/signal_h.m4 (gl_SIGNAL_H, gl_SIGNAL_H_DEFAULTS): Check for it.
* modules/signal (Makefile.am): Substitute the check's results.
* modules/pthread_sigmask, m4/pthread_sigmask.m4: New files.
Newer mingw (but not yet mingw64) provides two flavors of
snprintf: _snprintf defers straight to msvcrt, which has broken
return value and does not understand %llu or %zu; and snprintf,
which fixes these two bugs but does not understand %1$s.
Libintl specifically favors _snprintf, with broken return value,
even when compiled on mingw with a fixed snprintf, because the
only behavior which it wants to fix is %1$s handling. But this
means that the replacement libintl_snprintf has a broken return.
If one uses the 'snprintf-posix' module, then the gnulib
replacement kicks in, and does everything that libintl needs, so
on mingw, <libintl.h> specifically avoids overriding snprintf if
it detected that gnulib replaced snprintf. However, if one only
uses the 'snprintf' module and also uses libintl, this means
there are two problems:
1. The gnulib 'snprintf' module does not replace the mingw
snprintf function, because it has proper return values, while the
libintl.h header knows that %1$d is broken so snprintf must be
replaced, with the end result that the application gets the
libintl replacement snprintf with broken return values in spite
of the gnulib module.
2. Conversely, if the application did '#define snprintf snprintf',
that would be enough to make libintl avoid installing its own
replacement because libintl would see the define as a sign that
gnulib is happy with snprintf. However, if gnulib didn't enforce
%1$s, users can end up with translated strings that break when
passed to the native snprintf.
Happily, the gnulib snprintf replacement already guarantees %1$s
without needing any further preprocessor macros defined, and
without dragging in the LGPLv3+ bulk of snprintf-posix, so the
problem boils down to guaranteeing that gnulib will replace
snprintf if it lacks %1$s support. Basically, gnulib must
replace snprintf under all the same conditions as libintl, as
well as any other conditions of its own, if the libintl trick
of deferring to gnulib is to work correctly.
* m4/snprintf.m4 (gl_FUNC_SNPRINTF): Require %1$d support.
* m4/vsnprintf.m4 (gl_FUNC_VSNPRINTF): Likewise.
* doc/posix-functions/snprintf.texi (snprintf): Update.
* doc/posix-functions/vsnprintf.texi (vsnprintf): Likewise.
* tests/test-snprintf.c (main): Enhance test.
* tests/test-vsnprintf.c (main): Likewise.
Signed-off-by: Eric Blake <eblake@redhat.com>
* lib/safe-read.h: Explain the purpose of this module.
* lib/safe-write.h: Likewise.
* doc/posix-functions/read.texi: Mention EINTR and the 'safe-read'
module.
* doc/posix-functions/write.texi: Mention EINTR and the 'safe-write'
module.
Reported by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
I noticed a potential subtle double-close bug in libvirt. There,
a common idiom is to initialize an int fd[2]={-1,-1}, then have
multiple error paths goto common cleanup code. In the cleanup
code, the fds are closed if they are not already -1; this works
if the error label is reached before the pipe call, or after
pipe succeeds, but if it was the pipe call itself that jumped
to the error label, then it is relying on failed pipe() not
altering the values already in fd array prior to the failure.
Our pipe2 replacement violated this assumption, and could leave
a non-negative value in the array, which in turn would let
libvirt close an already-closed fd, possibly nuking an unrelated
fd opened by another thread that happened to get the same value.
As a result, I raised a POSIX issue regarding the behavior of
pipe on failure: http://austingroupbugs.net/view.php?id=467
Using that test program, I learned that most systems leave fd
unchanged on error, but that mingw always assigns -1 into the
array. This fixes the mingw pipe() replacement, as well as
the gnulib pipe2() replacement.
I don't know of any race-free way to work around a cygwin crash:
http://cygwin.com/ml/cygwin/2011-06/msg00328.html - we could
always open() and then close() two fds to guess whether two
spare fd still remain before calling pipe(), but that is racy.
* lib/pipe.c (pipe): Leave fd unchanged on error.
* lib/pipe2.c (pipe2): Likewise.
* doc/posix-functions/pipe.texi (pipe): Document cygwin issue.
* doc/glibc-functions/pipe2.texi (pipe2): Likewise.
Signed-off-by: Eric Blake <eblake@redhat.com>
On IRIX 6.5, link(file, "dangling") creates the target of dangling
as a link to file, rather than failing with EEXIST.
* m4/link.m4 (gl_FUNC_LINK): Expose the bug.
* lib/link.c (rpl_link): Work around it.
* tests/test-link.h (test_link): Enhance test.
* doc/posix-functions/link.texi (link): Document the bug.
Signed-off-by: Eric Blake <eblake@redhat.com>
On OpenBSD, strerror_r(1000,buf,19) gives "Unknown error: " rather
than "Unknown error: 100" while failing with ERANGE. Admittedly,
this behavior is nice, since a truncated integer is misleading,
but all other platforms use maximal strings on ERANGE and we are
already replacing strerror_r for other reasons, so it is easier
to work around this behavior than to adjust the testsuite (how
do you quickly decide if the only reason that the ERANGE string
was shorter than maximal was because the implementation avoided
truncating an integer?).
This patch intentionally avoids dragging in the strnlen module.
* lib/strerror_r.c (strerror_r): Always use maximal string.
* doc/posix-functions/strerror_r.texi (strerror_r): Document it.
Signed-off-by: Eric Blake <eblake@redhat.com>
OpenBSD treats strerror_r(0,,) as a success, but with a message
"Undefined error: 0"; while this is distinct from strerror_r(-1,,)
returning "Unknown error: -1", it does not imply success. Meanwhile,
if buf is short enough for ERANGE, then we can't use strstr to look
for "Unknown" or "Undefined" in the resulting message, like we had
been doing for strerror(). Fix this by shifting the burden - now
the strerror-override code guarantees that 0 will have an
override when needed.
* lib/strerror-override.c (strerror_override): Also override 0
when needed.
* lib/strerror-override.h (strerror_override): Likewise.
* lib/strerror.c (strerror): Simplify, now that 0 override is done
earlier.
* lib/strerror_r.c (strerror_r): Likewise.
* m4/strerror.m4 (gl_FUNC_STRERROR): Split detection of 0
behavior...
(gl_FUNC_STRERROR_0): ...into new macro.
* m4/strerror_r.m4 (gl_FUNC_STRERROR_R): Replace strerror_r if 0
is overridden.
(gl_FUNC_STRERROR_R_WORKS): Avoid extra tests if 0 is broken.
* modules/strerror-override (Files): Add strerror.m4.
(configure.ac): Also provide override for 0 when needed.
* doc/posix-functions/strerror.texi (strerror): Document this.
* doc/posix-functions/perror.texi (perror): Likewise.
Signed-off-by: Eric Blake <eblake@redhat.com>
* modules/round-ieee (Depends-on): Add floor-ieee, ceil-ieee.
* doc/posix-functions/round.texi: Mention problem with negative
arguments.
* doc/posix-functions/ceil.texi: Mention problem on OSF/1 5.1.
* m4/roundf.m4 (gl_FUNC_ROUNDF): Test also the sign of roundf (-0.3f).
* modules/roundf-ieee (Depends-on): Add floorf-ieee, ceilf-ieee.
* doc/posix-functions/roundf.texi: Mention problem with negative
arguments.
* doc/posix-functions/ceilf.texi: Mention problem on OSF/1 5.1.
MacOS X 10.5 strerror(0) is "Unknown error: 0", which is not distinguished
from "Unknown error: -1" for out-of-range. Worse, strerror_r(0,,)
is "Undefined error: 0", although strerror_r for all other out-of-range
values matches strerror.
* m4/strerror.m4 (gl_FUNC_STRERROR): Flush out MacOS bug.
* m4/strerror_r.m4 (gl_FUNC_STRERROR_R_WORKS): Likewise, and fix
logic bug.
* lib/strerror_r.c (strerror_r): Fix the bug.
* lib/strerror.c (strerror): Likewise.
* doc/posix-functions/strerror_r.texi (strerror_r): Document the
problem.
* doc/posix-functions/strerror.texi (strerror): Likewise.
* doc/posix-functions/perror.texi (perror): Likewise.
* tests/test-strerror.c (main): Enhance test.
* tests/test-strerror_r.c (main): Likewise.
Signed-off-by: Eric Blake <eblake@redhat.com>
Cygwin __xpg_strerror_r clobbers strerror, until cygwin 1.7.10; in
this case, we must replace strerror, but there was nothing in
strerror.m4 finding fault with cygwin's native strerror. Solve
this by splitting strerror_r.m4 into two parts, one for probing
for the strerror_r bug, and one for replacing strerror_r based
on the presence of bugs unrelated to signature issues; that way,
the 'strerror' module in isolation will not replace strerror, but
if strerror_r is in use for any other reason, then the two use
separate buffers.
Note that cygwin's strerror is thread-safe while the gnulib
replacement is not; but this is no worse than any other
platform where strerror is not thread-safe; in a single-threaded
program, the difference is not observable, and in a multi-threaded
program, you really shouldn't be using strerror in the first place.
Also note that this ends up replacing glibc 2.13 strerror as it
deems __xpg_strerror_r broken on that platform, which isn't
technically necessary for strerror, but doesn't hurt too much.
Meanwhile, glibc 2.14 fixed __xpg_strerror_r, and strerror is not
replaced in that scenario.
* m4/strerror_r.m4 (gl_FUNC_STRERROR_R): Split...
(gl_FUNC_STRERROR_R_WORKS): ...into new macro, to detect Cygwin
bug without replacing strerror_r.
* m4/strerror.m4 (gl_FUNC_STRERROR): Replace strerror if
strerror_r is buggy, but without requiring strerror_r compilation.
* doc/posix-functions/strerror_r.texi (strerror_r): Fix docs.
Signed-off-by: Eric Blake <eblake@redhat.com>
glibc was not the only platform where fprintf(fopen(,"r"))
fails to detect errors; cygwin 1.7.9 is another culprit
(although it will be fixed for 1.7.10), and I suspect that
several other platforms were failing perror2 for the same
reason.
At this point, there are so many functions affected, and
the way to avoid the bug is easy enough (don't pass bogus
streams to output-producing functions), that I'm not worried
about fixing things other than to document them.
* tests/test-perror2.c (main): Relax test on requiring detection
of stream errors, and use unbuffered stream.
* doc/posix-functions/dprintf.texi (dprintf): Document bug.
* doc/posix-functions/fprintf.texi (fprintf): Likewise.
* doc/posix-functions/fputc.texi (fputc): Likewise.
* doc/posix-functions/fputs.texi (fputs): Likewise.
* doc/posix-functions/fputws.texi (fputws): Likewise.
* doc/posix-functions/fwprintf.texi (fwprintf): Likewise.
* doc/posix-functions/fwrite.texi (fwrite): Likewise.
* doc/posix-functions/getopt.texi (getopt): Likewise.
* doc/posix-functions/perror.texi (perror): Likewise.
* doc/posix-functions/printf.texi (printf): Likewise.
* doc/posix-functions/psiginfo.texi (psiginfo): Likewise.
* doc/posix-functions/psignal.texi (psignal): Likewise.
* doc/posix-functions/putc.texi (putc): Likewise.
* doc/posix-functions/putc_unlocked.texi (putc_unlocked):
Likewise.
* doc/posix-functions/putchar.texi (putchar): Likewise.
* doc/posix-functions/putchar_unlocked.texi (putchar_unlocked):
Likewise.
* doc/posix-functions/puts.texi (puts): Likewise.
* doc/posix-functions/putwc.texi (putwc): Likewise.
* doc/posix-functions/putwchar.texi (putwchar): Likewise.
* doc/posix-functions/vdprintf.texi (vdprintf): Likewise.
* doc/posix-functions/vfprintf.texi (vfprintf): Likewise.
* doc/posix-functions/vfwprintf.texi (vfwprintf): Likewise.
* doc/posix-functions/vprintf.texi (vprintf): Likewise.
* doc/posix-functions/vwprintf.texi (vwprintf): Likewise.
* doc/posix-functions/wordexp.texi (wordexp): Likewise.
* doc/posix-functions/wprintf.texi (wprintf): Likewise.
Signed-off-by: Eric Blake <eblake@redhat.com>
AIX 7.1 realpath() gets horribly confused by consecutive /
in the name to be resolved.
* m4/canonicalize.m4 (gl_FUNC_REALPATH_WORKS): Expose AIX bug.
* doc/posix-functions/realpath.texi (realpath): Document it.
Reported by Bruno Haible.
Signed-off-by: Eric Blake <eblake@redhat.com>
* m4/setlocale.m4 (gl_FUNC_SETLOCALE): Set REPLACE_SETLOCALE also on
Cygwin 1.5.x.
* doc/posix-functions/setlocale.texi: Mention that the problem with the
LC_CTYPE category also exists on Cygwin 1.5.x.
No need to make a wrapper that burns static storage when we can
just use stack storage.
* modules/perror (Files): Drop strerror-impl.h.
* lib/perror.c (perror): Use our own stack buffer, rather than
calling a wrapper that uses static storage.
* doc/posix-functions/perror.texi (perror): Document a limitation
of our replacement.
Signed-off-by: Eric Blake <eblake@redhat.com>
mingw getcwd(buf, 0) fails with ERANGE, instead of the required
EINVAL. Since we're already replacing getcwd on mingw, the
workaround is trivial.
* lib/getcwd-lgpl.c (rpl_getcwd): Guarantee correct error.
* doc/posix-functions/getcwd.texi (getcwd): Document it.
Reported by Matthias Bolte.
Signed-off-by: Eric Blake <eblake@redhat.com>
Document it as a known bug, but one where we don't provide a
workaround since programmers are unlikely to hit it in practice.
* doc/posix-functions/fprintf.texi (fprintf): Document it.
* doc/posix-functions/printf.texi (printf): Likewise.
* doc/posix-functions/vfprintf.texi (vfprintf): Likewise.
* doc/posix-functions/vprintf.texi (vprintf): Likewise.
Signed-off-by: Eric Blake <eblake@redhat.com>
Solaris 10 populates buf on EINVAL, but not on ERANGE.
* lib/strerror_r.c (strerror_r): Partially populate buf on ERANGE
failures.
* doc/posix-functions/strerror_r.texi (strerror_r): Document this.
Signed-off-by: Eric Blake <eblake@redhat.com>
POSIX recommends (but does not require) that strerror_r populate
buf even on error. But since we guarantee this behavior for
strerror, we might as well also guarantee it for strerror_r.
* lib/strerror_r.c (safe_copy): New helper method.
(strerror_r): Guarantee a non-empty string.
* tests/test-strerror_r.c (main): Enhance tests to incorporate
recent POSIX rulings and to match our strerror guarantees.
* doc/posix-functions/strerror_r.texi (strerror_r): Document this.
Signed-off-by: Eric Blake <eblake@redhat.com>
Avoid cygwin strerror_r, since it clobbers strerror buffer through
cygwin 1.7.9. __xpg_strerror_r is okay, but if a program is
compiled on cygwin 1.7.8 or earlier, it is not available.
* lib/strerror_r.c (strerror_r): Don't use cygwin's strerror_r;
fall back instead to sys_errlist.
* modules/strerror (configure.ac): Add witness.
* tests/test-strerror_r.c (main): Enhance test.
* doc/posix-functions/strerror_r.texi (strerror_r): Document it.
* tests/test-perror2.c (main): Free memory before exit.
Signed-off-by: Eric Blake <eblake@redhat.com>
On Solaris, a non-zero return was also reflected into errno.
Leaving errno unchanged is a useful feature worth guaranteeing.
* m4/strerror_r.m4 (gl_FUNC_STRERROR_R): Check for Solaris behavior.
* doc/posix-functions/strerror_r.texi (strerror_r): Document it.
Signed-off-by: Eric Blake <eblake@redhat.com>
POSIX requires that 'errno = 0; perror ("")' print the same message
as strerror(0), but this failed if we were replacing strerror to work
around the FreeBSD bug of treating 0 as a failure.
The goal here is to _not_ replace perror on glibc, even though
strerror_r has to be replaced, because the strerror_r replacement is
only for the sake of correcting the signature rather than working
around bugs in the handling of any particular errnum value. Recall
that $gl_cv_func_strerror_r_works is only set if the POSIX signature
was detected in the first place.
* m4/perror.m4 (gl_FUNC_PERROR): Also replace perror if strerror_r
is broken. Move AC_LIBOBJ...
* modules/perror (configure.ac): Here.
* doc/posix-functions/perror.texi (perror): Document this.
* tests/test-perror2.c (main): Enhance test.
Signed-off-by: Eric Blake <eblake@redhat.com>
This uncovered a glibc bug, although not many people check for
perror failures, so for now I'm not working around it.
http://sourceware.org/bugzilla/show_bug.cgi?id=12792
* tests/macros.h (STREQ) Add macro.
* modules/perror-tests (Files): Add second test.
* tests/test-perror2.c (main): New file.
* doc/posix-functions/perror.texi (perror): Document glibc bug.
Signed-off-by: Eric Blake <eblake@redhat.com>
getcwd(NULL, 1) mallocs a larger buffer on BSD, rather than failing
with ERANGE as on glibc. This behavior difference is not worth
coding around, as it is an uncommon use of getcwd in the first place.
* doc/posix-functions/getcwd.texi (getcwd): Document portability
issue.
* tests/test-getcwd-lgpl.c (main): Relax test.
Reported by Matthias Bolte.
Signed-off-by: Eric Blake <eblake@redhat.com>