glibc/io
Zack Weinberg 329ea513b4 Avoid cancellable I/O primitives in ld.so.
Neither the <dlfcn.h> entry points, nor lazy symbol resolution, nor
initial shared library load-up, are cancellation points, so ld.so
should exclusively use I/O primitives that are not cancellable.  We
currently achieve this by having the cancellation hooks compile as
no-ops when IS_IN(rtld); this patch changes to using exclusively
_nocancel primitives in the source code instead, which makes the
intent clearer and significantly reduces the amount of code compiled
under IS_IN(rtld) as well as IS_IN(libc) -- in particular,
elf/Makefile no longer thinks we require a copy of unwind.c in
rtld-libc.a.  (The older mechanism is preserved as a backstop.)

The bulk of the change is splitting up the files that define the
_nocancel I/O functions, so they don't also define the variants that
*are* cancellation points; after which, the existing logic for picking
out the bits of libc that need to be recompiled as part of ld.so Just
Works.  I did this for all of the _nocancel functions, not just the
ones used by ld.so, for consistency.

fcntl was a little tricky because it's only a cancellation point for
certain opcodes (F_SETLKW(64), which can block), and the existing
__fcntl_nocancel wasn't applying the FCNTL_ADJUST_CMD hook, which
strikes me as asking for trouble, especially as the only nontrivial
definition of FCNTL_ADJUST_CMD (for powerpc64) changes F_*LK* opcodes.
To fix this, fcntl_common moves to fcntl_nocancel.c along with
__fcntl_nocancel, and changes its name to the extern (but hidden)
symbol __fcntl_nocancel_adjusted, so that regular fcntl can continue
calling it.  __fcntl_nocancel now applies FCNTL_ADJUST_CMD; so that
both both fcntl.c and fcntl_nocancel.c can see it, the only nontrivial
definition moves from sysdeps/u/s/l/powerpc/powerpc64/fcntl.c to
.../powerpc64/sysdep.h and becomes entirely a macro, instead of a macro
that calls an inline function.

The nptl version of libpthread also changes a little, because its
"compat-routines" formerly included files that defined all the
_nocancel functions it uses; instead of continuing to duplicate them,
I exported the relevant ones from libc.so as GLIBC_PRIVATE.  Since the
Linux fcntl.c calls a function defined by fcntl_nocancel.c, it can no
longer be used from libpthread.so; instead, introduce a custom
forwarder, pt-fcntl.c, and export __libc_fcntl from libc.so as
GLIBC_PRIVATE.  The nios2-linux ABI doesn't include a copy of vfork()
in libpthread, and it was handling that by manipulating
libpthread-routines in .../linux/nios2/Makefile; it is cleaner to do
what other such ports do, and have a pt-vfork.S that defines no symbols.

Right now, it appears that Hurd does not implement _nocancel I/O, so
sysdeps/generic/not-cancel.h will forward everything back to the
regular functions.  This changed the names of some of the functions
that sysdeps/mach/hurd/dl-sysdep.c needs to interpose.

	* elf/dl-load.c, elf/dl-misc.c, elf/dl-profile.c, elf/rtld.c
	* sysdeps/unix/sysv/linux/dl-sysdep.c
	Include not-cancel.h.  Use __close_nocancel instead of __close,
	__open64_nocancel instead of __open, __read_nocancel instead of
	__libc_read, and __write_nocancel instead of __libc_write.

	* csu/check_fds.c (check_one_fd)
	* sysdeps/posix/fdopendir.c (__fdopendir)
	* sysdeps/posix/opendir.c (__alloc_dir): Use __fcntl_nocancel
        instead of __fcntl and/or __libc_fcntl.

	* sysdeps/unix/sysv/linux/pthread_setname.c (pthread_setname_np)
	* sysdeps/unix/sysv/linux/pthread_getname.c (pthread_getname_np)
        * sysdeps/unix/sysv/linux/i386/smp.h (is_smp_system):
	Use __open64_nocancel instead of __open_nocancel.

	* sysdeps/unix/sysv/linux/not-cancel.h: Move all of the
	hidden_proto declarations to the end and issue them if either
	IS_IN(libc) or IS_IN(rtld).
	* sysdeps/unix/sysv/linux/Makefile [subdir=io] (sysdep_routines):
	Add close_nocancel, fcntl_nocancel, nanosleep_nocancel,
	open_nocancel, open64_nocancel, openat_nocancel, pause_nocancel,
	read_nocancel, waitpid_nocancel, write_nocancel.

        * io/Versions [GLIBC_PRIVATE]: Add __libc_fcntl,
        __fcntl_nocancel, __open64_nocancel, __write_nocancel.
        * posix/Versions: Add __nanosleep_nocancel, __pause_nocancel.

        * nptl/pt-fcntl.c: New file.
        * nptl/Makefile (pthread-compat-wrappers): Remove fcntl.
        (libpthread-routines): Add pt-fcntl.
        * include/fcntl.h (__fcntl_nocancel_adjusted): New function.
        (__libc_fcntl): Remove attribute_hidden.
	* sysdeps/unix/sysv/linux/fcntl.c (__libc_fcntl): Call
	__fcntl_nocancel_adjusted, not fcntl_common.
        (__fcntl_nocancel): Move to new file fcntl_nocancel.c.
	(fcntl_common): Rename to __fcntl_nocancel_adjusted; also move
	to fcntl_nocancel.c.
	* sysdeps/unix/sysv/linux/fcntl_nocancel.c: New file.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c: Remove file.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h:
	Define FCNTL_ADJUST_CMD here, as a self-contained macro.

	* sysdeps/unix/sysv/linux/close.c: Move __close_nocancel to...
	* sysdeps/unix/sysv/linux/close_nocancel.c: ...this new file.
	* sysdeps/unix/sysv/linux/nanosleep.c: Move __nanosleep_nocancel to...
	* sysdeps/unix/sysv/linux/nanosleep_nocancel.c: ...this new file.
	* sysdeps/unix/sysv/linux/open.c: Move __open_nocancel to...
	* sysdeps/unix/sysv/linux/open_nocancel.c: ...this new file.
	* sysdeps/unix/sysv/linux/open64.c: Move __open64_nocancel to...
	* sysdeps/unix/sysv/linux/open64_nocancel.c: ...this new file.
	* sysdeps/unix/sysv/linux/openat.c: Move __openat_nocancel to...
	* sysdeps/unix/sysv/linux/openat_nocancel.c: ...this new file.
	* sysdeps/unix/sysv/linux/openat64.c: Move __openat64_nocancel to...
	* sysdeps/unix/sysv/linux/openat64_nocancel.c: ...this new file.
	* sysdeps/unix/sysv/linux/pause.c: Move __pause_nocancel to...
	* sysdeps/unix/sysv/linux/pause_nocancel.c: ...this new file.
	* sysdeps/unix/sysv/linux/read.c: Move __read_nocancel to...
	* sysdeps/unix/sysv/linux/read_nocancel.c: ...this new file.
	* sysdeps/unix/sysv/linux/waitpid.c: Move __waitpid_nocancel to...
	* sysdeps/unix/sysv/linux/waitpid_nocancel.c: ...this new file.
	* sysdeps/unix/sysv/linux/write.c: Move __write_nocancel to...
	* sysdeps/unix/sysv/linux/write_nocancel.c: ...this new file.

        * sysdeps/unix/sysv/linux/nios2/Makefile: Don't override
        libpthread-routines.
        * sysdeps/unix/sysv/linux/nios2/pt-vfork.S: New file which
        defines nothing.

        * sysdeps/mach/hurd/dl-sysdep.c: Define __read instead of
        __libc_read, and __write instead of __libc_write.  Define
        __open64 in addition to __open.
2018-06-12 09:53:04 -04:00
..
bits Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
sys Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
Makefile linux: make getcwd(3) fail if it cannot obtain an absolute path [BZ #22679] 2018-01-12 14:49:49 +00:00
Versions Avoid cancellable I/O primitives in ld.so. 2018-06-12 09:53:04 -04:00
access.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
bug-ftw1.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
bug-ftw2.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
bug-ftw3.c Update. 2002-02-07 17:54:45 +00:00
bug-ftw4.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
bug-ftw5.c [BZ #4076] 2007-02-21 09:36:46 +00:00
chdir.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
chmod.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
chown.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
close.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
copy_file_range-compat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
copy_file_range.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
creat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
creat64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
dup.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
dup2.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
dup3.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
euidaccess.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
faccessat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fchdir.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fchmod.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fchmodat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fchown.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fchownat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fcntl.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fcntl.h Fix a typo in a comment. 2018-02-21 04:00:03 -08:00
flock.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fstat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fstat64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fstatat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fstatat64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fstatfs.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fstatfs64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fstatvfs.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fstatvfs64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fts.c Revert __dirfd PLT avoidance for now 2018-04-02 21:45:38 +02:00
fts.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fts64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
ftw.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
ftw.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
ftw64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
ftwtest-sh Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
ftwtest.c Update. 2003-11-07 23:00:00 +00:00
futimens.c Add missing start-of-file descriptive comment. 2018-03-06 09:21:04 +01:00
fxstat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fxstat64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fxstatat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
fxstatat64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
getcwd.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
getdirname.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
getwd.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
isatty.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
lchmod.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
lchown.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
link.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
linkat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
lockf.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
lockf64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
lseek.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
lseek64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
lstat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
lstat64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
lxstat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
lxstat64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
mkdir.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
mkdirat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
mkfifo.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
mkfifoat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
mknod.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
mknodat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
open.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
open64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
open64_2.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
open_2.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
openat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
openat64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
openat64_2.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
openat_2.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
pipe.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
pipe2.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
poll.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
poll.h initial import 1995-02-18 01:27:10 +00:00
posix_fadvise.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
posix_fadvise64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
posix_fallocate.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
posix_fallocate64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
ppoll.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
pwd.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
read.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
readlink.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
readlinkat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
rmdir.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
sendfile.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
sendfile64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
stat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
stat64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
statfs.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
statfs64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
statvfs.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
statvfs64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
symlink.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
symlinkat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
test-lfs.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
test-stat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
test-stat2.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
test-utime.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-copy_file_range-compat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-copy_file_range.c hurd: Fix building io/tst-copy_file_range.c 2018-01-28 17:56:49 +01:00
tst-faccessat.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
tst-fchmodat.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
tst-fchownat.c Revert "hurd: Fix building io/tst-fchownat.c" 2018-01-28 19:13:20 +01:00
tst-fcntl.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-fstatat.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
tst-fts-lfs.c Add LFS support for fts functions (bug 11460) 2015-11-06 11:24:16 +01:00
tst-fts.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-futimesat.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
tst-getcwd-abspath.c linux: make getcwd(3) fail if it cannot obtain an absolute path [BZ #22679] 2018-01-12 14:49:49 +00:00
tst-getcwd.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-linkat.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
tst-mkdirat.c Assume that _DIRENT_HAVE_D_TYPE is always defined. 2017-10-30 15:48:33 +01:00
tst-mkfifoat.c Assume that _DIRENT_HAVE_D_TYPE is always defined. 2017-10-30 15:48:33 +01:00
tst-mknodat.c Assume that _DIRENT_HAVE_D_TYPE is always defined. 2017-10-30 15:48:33 +01:00
tst-open-tmpfile.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-openat.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
tst-posix_fallocate-common.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-posix_fallocate.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-posix_fallocate64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-readlinkat.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
tst-renameat.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
tst-statvfs.c Update. 2003-10-27 04:05:04 +00:00
tst-symlinkat.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
tst-ttyname_r.c * nis/nis_subr.c (nis_getnames): Revert last change. 2006-12-05 21:28:15 +00:00
tst-unlinkat.c Add missing header files throughout the testsuite. 2017-02-16 17:33:18 -05:00
ttyname.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
ttyname_r.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
umask.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
unlink.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
unlinkat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
utime.c Add missing start-of-file descriptive comment. 2018-03-06 09:21:04 +01:00
utime.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
utimensat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
write.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xmknod.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xmknodat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xstat.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
xstat64.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00