glibc/sysdeps/posix
Eric Rannaud 65f6f938cd linux: open and openat ignore 'mode' with O_TMPFILE in flags
Both open and openat load their last argument 'mode' lazily, using
va_arg() only if O_CREAT is found in oflag. This is wrong, mode is also
necessary if O_TMPFILE is in oflag.

By chance on x86_64, the problem wasn't evident when using O_TMPFILE
with open, as the 3rd argument of open, even when not loaded with
va_arg, is left untouched in RDX, where the syscall expects it.

However, openat was not so lucky, and O_TMPFILE couldn't be used: mode
is the 4th argument, in RCX, but the syscall expects its 4th argument in
a different register than the glibc wrapper, in R10.

Introduce a macro __OPEN_NEEDS_MODE (oflag) to test if either O_CREAT or
O_TMPFILE is set in oflag.

Tested on Linux x86_64.

	[BZ #17523]
	* io/fcntl.h (__OPEN_NEEDS_MODE): New macro.
	* io/bits/fcntl2.h (open): Use it.
	(openat): Likewise.
	* io/open.c (__libc_open): Likewise.
	* io/open64.c (__libc_open64): Likewise.
	* io/open64_2.c (__open64_2): Likewise.
	* io/open_2.c (__open_2): Likewise.
	* io/openat.c (__openat): Likewise.
	* io/openat64.c (__openat64): Likewise.
	* io/openat64_2.c (__openat64_2): Likewise.
	* io/openat_2.c (__openat_2): Likewise.
	* sysdeps/mach/hurd/open.c (__libc_open): Likewise.
	* sysdeps/mach/hurd/openat.c (__openat): Likewise.
	* sysdeps/posix/open64.c (__libc_open64): Likewise.
	* sysdeps/unix/sysv/linux/dl-openat64.c (openat64): Likewise.
	* sysdeps/unix/sysv/linux/generic/open.c (__libc_open): Likewise.
	(__open_nocancel): Likewise.
	* sysdeps/unix/sysv/linux/generic/open64.c (__libc_open64): Likewise.
	* sysdeps/unix/sysv/linux/open64.c (__libc_open64): Likewise.
	* sysdeps/unix/sysv/linux/openat.c (__OPENAT): Likewise.
2015-02-24 13:19:22 +05:30
..
Makefile
alarm.c
clock.c
clock_getres.c
closedir.c
ctermid.c
cuserid.c
dirfd.c
dirstream.h
dup.c
dup2.c
euidaccess.c
fdopendir.c
flock.c
fpathconf.c
gai_strerror-strs.h
gai_strerror.c
getaddrinfo.c
getcwd.c
getdtsz.c
gethostname.c
getpagesize.c
gettimeofday.c
isatty.c
isfdtype.c
killpg.c
libc_fatal.c
mkfifo.c
mkfifoat.c
nice.c
open64.c linux: open and openat ignore 'mode' with O_TMPFILE in flags 2015-02-24 13:19:22 +05:30
opendir.c
pathconf.c
pause.c
posix_fallocate.c
posix_fallocate64.c
pread.c
pread64.c
preadv.c
preadv64.c
profil.c
pwrite.c
pwrite64.c
pwritev.c
pwritev64.c
raise.c
readdir.c
readdir_r.c
readv.c
remove.c
rename.c
rewinddir.c
seekdir.c
shm-directory.c
shm-directory.h
shm_open.c
shm_unlink.c
sigblock.c
sigignore.c
sigintr.c
signal.c
sigpause.c
sigset.c
sigsetmask.c
sigsuspend.c
sigwait.c
sleep.c
spawni.c
sprofil.c
sysconf.c
system.c
sysv_signal.c
telldir.c
tempname.c
time.c
timespec_get.c
truncate.c
ttyname.c
ttyname_r.c
ulimit.c
utime.c
utimes.c
wait.c
wait3.c
waitid.c
writev.c