view doc/posix-functions/isupper.texi @ 15326:52719068f9c2

pipe, pipe2: don't corrupt fd on error 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>
author Eric Blake <eblake@redhat.com>
date Wed, 29 Jun 2011 15:46:50 -0600
parents bb0ceefd22dc
children fc6f79af802f
line wrap: on
line source

@node isupper
@section @code{isupper}
@findex isupper

POSIX specification:@* @url{http://www.opengroup.org/onlinepubs/9699919799/functions/isupper.html}

Gnulib module: ---

Portability problems fixed by Gnulib:
@itemize
@end itemize

Portability problems not fixed by Gnulib:
@itemize
@end itemize

Note: This function's behaviour depends on the locale, but does not support
the multibyte characters that occur in strings in locales with
@code{MB_CUR_MAX > 1} (this includes all the common UTF-8 locales).
There are four alternative APIs:

@table @code
@item c_isupper
This function operates in a locale independent way and returns true only for
ASCII characters.  It is provided by the Gnulib module @samp{c-ctype}.

@item iswupper
This function operates in a locale dependent way, on wide characters.  In
order to use it, you first have to convert from multibyte to wide characters,
using the @code{mbrtowc} function.  It is provided by the Gnulib module
@samp{wctype}.

@item mb_isupper
This function operates in a locale dependent way, on multibyte characters.
It is provided by the Gnulib module @samp{mbchar}.

@item uc_is_upper
This function operates in a locale independent way, on Unicode characters.
It is provided by the Gnulib module @samp{unictype/ctype-upper}.
@end table