glibc/libio
Adhemerval Zanella f1a67a2c78 libio: Avoid dup already opened file descriptor [BZ#21393]
As described in BZ#21398 (close as dup of 21393) report current
freopen implementation fails when one tries to freopen STDIN_FILENO,
STDOUT_FILENO, or STDERR_FILENO.  Although on bug report the
discussion leads to argue if a close followed by a freopen on the
standard file is a valid operation, the underlying issue is not
really the check for dup3 returned value, but rather calling it
if the returned file descriptor is equal as the input one.

So for a quality of implementation this patch avoid calling dup3
for the aforementioned case.  It also adds a dup3 error case check
for the two possible failures, with one being Linux only: EINTR and
EBUSY.  The EBUSY issue is better explained on this stackoverflow
thread [1], but in a short it is due the internal Linux
implementation which allows a race condition window for dup2 due
the logic dissociation of file descriptor allocation and actual
VFS 'install' operation.  For both outliers failures all allocated
memory is freed and a NULL FILE* is returned.

With this patch the example on BZ#21398 is now actually possible
(I used as the testcase for the bug report).  Checked on
x86_64-linux-gnu.

	[BZ #21393]
	* libio/freopen.c (freopen): Avoid dup already opened file descriptor
	and add a check for dup3 failure.
	* libio/freopen64.c (freopen64): Likewise.
	* libio/tst-freopen.c (do_test): Rename to do_test_basic and use
	libsupport.
	(do_test_bz21398): New test.
	* manual/stdio.texi (freopen): Add documentation of EBUSY failure.

[1] http://stackoverflow.com/questions/23440216/race-condition-when-using-dup2
2017-05-22 18:13:35 -03:00
..
bits Remove C++ namespace handling from glibc headers. 2017-03-16 13:31:57 +00:00
__fbufsize.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
__flbf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
__fpending.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
__fpurge.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
__freadable.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
__freading.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
__fsetlocking.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
__fwritable.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
__fwriting.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
bug-fopena+.c Update. 2002-08-27 06:41:29 +00:00
bug-fseek.c Update. 2002-07-24 11:18:48 +00:00
bug-ftell.c * libio/bug-ftell.c (do_test): Add a cast. 2003-11-01 21:11:05 +00:00
bug-memstream1.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
bug-mmap-fflush.c Update. 2002-08-27 12:10:11 +00:00
bug-rewind2.c Fix warnings in fwscanf / rewind tests. 2014-11-26 12:54:39 +00:00
bug-rewind.c Fix warnings in fwscanf / rewind tests. 2014-11-26 12:54:39 +00:00
bug-ungetc2.c Update. 2003-09-06 09:56:14 +00:00
bug-ungetc3.c Update. 2004-11-09 07:05:27 +00:00
bug-ungetc4.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
bug-ungetc.c 2002-07-24 Roland McGrath <roland@frob.com> 2002-07-24 09:34:59 +00:00
bug-ungetwc1.c Fix libio/bug-ungetwc1.c warning. 2014-11-27 16:01:04 +00:00
bug-ungetwc2.c Update. 2002-04-24 21:09:14 +00:00
bug-wfflush.c * libio/bug-wfflush.c (do_test): Call rewind instead of fsetpos. 2002-11-11 06:55:22 +00:00
bug-wmemstream1.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
bug-wsetpos.c Fix fsetpos on wide stream. 2009-09-02 19:45:33 -07:00
clearerr_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
clearerr.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
Depend New file, libio needs localedata for tests. 2000-07-29 07:57:34 +00:00
fcloseall.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
feof_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
feof.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
ferror_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
ferror.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
filedoalloc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
fileno.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
fileops.c Assume that O_CLOEXEC is always defined and works 2017-04-18 14:56:51 +02:00
fmemopen.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
fputc_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
fputc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
fputwc_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
fputwc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
freopen64.c libio: Avoid dup already opened file descriptor [BZ#21393] 2017-05-22 18:13:35 -03:00
freopen.c libio: Avoid dup already opened file descriptor [BZ#21393] 2017-05-22 18:13:35 -03:00
fseek.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
fseeko64.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
fseeko.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
ftello64.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
ftello.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
fwide.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
fwprintf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
fwscanf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
genops.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
getc_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
getc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
getchar_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
getchar.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
getwc_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
getwc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
getwchar_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
getwchar.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofclose.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofdopen.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofflush_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofflush.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofgetpos64.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofgetpos.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofgets_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofgets.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofgetws_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofgetws.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofopen64.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofopen.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofopncook.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofputs_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofputs.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofputws_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofputws.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofread_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofread.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofsetpos64.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofsetpos.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
ioftell.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofwide.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofwrite_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iofwrite.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iogetdelim.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iogetline.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iogets.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iogetwline.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iolibio.h Remove use of INTDEF/INTUSE in libio 2012-05-24 23:06:20 +02:00
iopadn.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iopopen.c Assume that O_CLOEXEC is always defined and works 2017-04-18 14:56:51 +02:00
ioputs.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
ioseekoff.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
ioseekpos.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iosetbuffer.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iosetvbuf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
ioungetc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
ioungetwc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iovdprintf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iovsprintf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iovsscanf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iovswscanf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
iowpadn.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
libc_fatal.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
libio.h Remove _IO_MTSAFE_IO from public headers. 2017-05-11 19:14:11 -04:00
libioP.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
Makefile Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
memstream.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
obprintf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
oldfileops.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
oldfmemopen.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
oldiofclose.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
oldiofdopen.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
oldiofgetpos64.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
oldiofgetpos.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
oldiofopen.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
oldiofsetpos64.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
oldiofsetpos.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
oldiopopen.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
oldpclose.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
oldstdfiles.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
oldtmpfile.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
pclose.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
peekc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
putc_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
putc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
putchar_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
putchar.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
putwc_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
putwc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
putwchar_u.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
putwchar.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
rewind.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
setbuf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
setlinebuf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
stdfiles.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
stdio.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
stdio.h getopt: eliminate __need_getopt by splitting up getopt.h. 2017-04-07 07:53:03 -04:00
strfile.h Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
strops.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
swprintf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
swscanf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
test-fmemopen.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
test-freopen.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
test-freopen.sh Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
tst_getwc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
tst_getwc.input Update. 2000-06-23 06:22:36 +00:00
tst_putwc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
tst_swprintf.c Fix format strings. 2002-09-30 07:47:16 +00:00
tst_swscanf.c Update. 2001-02-09 17:57:28 +00:00
tst_wprintf2.c Add dependencies on needed locales in each subdir tests (bug 18969) 2015-10-12 15:18:08 +02:00
tst_wprintf.c Update. 2000-06-17 19:22:43 +00:00
tst_wscanf.c Update. 2001-02-09 17:57:28 +00:00
tst_wscanf.input Update. 1999-06-16 22:55:47 +00:00
tst-atime.c Fix libio/tst-atime not to presume ST_NOATIME exists. 2015-02-06 12:24:16 -08:00
tst-eof.c pdate. 2002-07-23 00:31:41 +00:00
tst-ext2.c * libio/Makefile (tests): Add tst-ext2. 2007-10-13 07:33:09 +00:00
tst-ext.c Update. 2001-03-27 00:16:51 +00:00
tst-fgetwc.c (do_test): Use de_DE.UTF-8 as locale name. 2009-06-15 17:27:48 -07:00
tst-fgetwc.input 2009-02-04 Ulrich Drepper <drepper@redhat.com> 2009-02-04 21:27:48 +00:00
tst-fgetws.c Fix format strings. 2002-09-30 07:47:16 +00:00
tst-fopenloc2.c [BZ #2173] 2006-01-19 01:35:28 +00:00
tst-fopenloc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
tst-fputws.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
tst-freopen.c libio: Avoid dup already opened file descriptor [BZ#21393] 2017-05-22 18:13:35 -03:00
tst-fseek.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
tst-ftell-active-handler.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
tst-ftell-append.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
tst-ftell-partial-wide.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
tst-fwrite-error.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
tst-memstream1.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
tst-memstream2.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
tst-memstream3.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
tst-mmap2-eofsync.c 2016-06-11 Paul Pluzhnikov <ppluzhnikov@google.com> 2016-06-11 14:50:16 -07:00
tst-mmap-eofsync.c * locale/xlocale.h (struct __locale_struct): New member `__names'. 2002-08-30 10:36:44 +00:00
tst-mmap-fflushsync.c * locale/xlocale.h (struct __locale_struct): New member `__names'. 2002-08-30 10:36:44 +00:00
tst-mmap-offend.c * locale/xlocale.h (struct __locale_struct): New member `__names'. 2002-08-30 10:36:44 +00:00
tst-mmap-setvbuf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
tst-popen1.c * sysdeps/unix/sysv/linux/syscalls.list: Add __pipe2 alias. 2008-07-27 18:26:13 +00:00
tst-setvbuf1.c [BZ #2337] 2006-12-13 23:17:54 +00:00
tst-sscanf.c Modify several tests to use test-skeleton.c 2014-11-05 15:24:08 +05:30
tst-swscanf.c Update. 2002-02-26 18:08:08 +00:00
tst-ungetwc1.c Modify several tests to use test-skeleton.c 2014-11-05 15:24:08 +05:30
tst-ungetwc2.c Modify several tests to use test-skeleton.c 2014-11-05 15:24:08 +05:30
tst-widetext.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
tst-widetext.input Rename Oriya locale to Odia (bug 15601) 2013-11-20 17:47:41 +05:30
tst-wmemstream1.c * posix/glob.c (glob_in_dir): Add some comments and asserts to 2006-09-30 15:09:35 +00:00
tst-wmemstream2.c * posix/glob.c (glob_in_dir): Add some comments and asserts to 2006-09-30 15:09:35 +00:00
tst-wmemstream3.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
vasprintf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
Versions libio: fmemopen rewrite to POSIX compliance 2015-07-08 12:07:21 -03:00
vscanf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
vsnprintf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
vswprintf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
vtables.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
vwprintf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
vwscanf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
wfiledoalloc.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
wfileops.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
wgenops.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
wmemstream.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
wprintf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
wscanf.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00
wstrops.c Update copyright dates with scripts/update-copyrights. 2017-01-01 00:14:16 +00:00