* cygwin.din (dup3): Export.
(pipe2): Export. * dtable.cc (dtable::dup_worker): Take additional flags parameter. Handle O_CLOEXEC flag. (dtable::dup3): Rename from dup2. Take additional flags parameter. Check for valid flags. Drop check for newfd == oldfd. * dtable.h (dtable::dup_worker): Add flags parameter. (dtable::dup3): Rename from dup2. * fcntl.cc (fcntl64): Add F_DUPFD_CLOEXEC case. * fhandler.h (fhandler_mailslot::get_object_attr): Add flags parameter. * fhandler.cc (fhandler_base::open): Use security attribute with inheritance according to setting of O_CLOEXEC flag. * fhandler_console.cc (fhandler_console::open): Ditto. * fhandler_fifo.cc (sec_user_cloexec): New inline function to create security attribute with inheritance according to setting of O_CLOEXEC flag. (fhandler_fifo::open): Call sec_user_cloexec to fetch security attribute. (fhandler_fifo::wait): Ditto. * fhandler_mem.cc (fhandler_dev_mem::open): Ditto. * fhandler_mailslot.cc (fhandler_mailslot::get_object_attr): Take additional flags parameter. Use security attribute with inheritance according to setting of O_CLOEXEC flag. (fhandler_mailslot::open): Call get_object_attr with flags parameter. * fhandler_registry.cc (fhandler_registry::open): Call set_close_on_exec on real handles to accommodate O_CLOEXEC flag. * fhandler_tty.cc (fhandler_tty_slave::open): Ditto. * fhandler_tape.cc: Create mutex with inheritance according to setting of O_CLOEXEC flag. * pipe.cc: Replace usage of O_NOINHERIT with O_CLOEXEC. (fhandler_pipe::init): Simplify setting close_on_exec flag. (fhandler_pipe::open): Remove setting close_on_exec flag. (fhandler_pipe::create): Use security attribute with inheritance according to setting of O_CLOEXEC flag. (pipe2): New exported function. * posix_ipc.cc: Throughout, open backing files with O_CLOEXEC flag to follow POSIX semantics. * security.h (sec_none_cloexec): New define. * syscalls.cc (dup): Add missing extern "C" qualifier. Accommodate renaming of dtable::dup2 to dtable::dup3. (dup2): Ditto. Check newfd == oldfd here. (dup3): New function. Check newfd == oldfd here. (open): Set close_on_exec flag according to O_CLOEXEC flag before calling fhandler->open. * include/cygwin/version.h (CYGWIN_VERSION_API_MINOR): Bump.
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
/* pipe.cc: pipe for Cygwin.
|
||||
|
||||
Copyright 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009 Hat, Inc.
|
||||
2008, 2009, 2010 Hat, Inc.
|
||||
|
||||
This file is part of Cygwin.
|
||||
|
||||
@@ -53,8 +53,7 @@ fhandler_pipe::init (HANDLE f, DWORD a, mode_t mode)
|
||||
bool opened_properly = a & FILE_CREATE_PIPE_INSTANCE;
|
||||
a &= ~FILE_CREATE_PIPE_INSTANCE;
|
||||
fhandler_base::init (f, a, mode);
|
||||
if (mode & O_NOINHERIT)
|
||||
close_on_exec (true);
|
||||
close_on_exec (mode & O_CLOEXEC);
|
||||
setup_overlapped (opened_properly);
|
||||
return 1;
|
||||
}
|
||||
@@ -116,7 +115,7 @@ fhandler_pipe::open (int flags, mode_t mode)
|
||||
set_errno (EACCES);
|
||||
goto out;
|
||||
}
|
||||
inh = !(flags & O_NOINHERIT);
|
||||
inh = !(flags & O_CLOEXEC);
|
||||
if (!DuplicateHandle (proc, pipe_hdl, GetCurrentProcess (), &nio_hdl,
|
||||
0, inh, DUPLICATE_SAME_ACCESS))
|
||||
{
|
||||
@@ -124,8 +123,6 @@ fhandler_pipe::open (int flags, mode_t mode)
|
||||
goto out;
|
||||
}
|
||||
init (nio_hdl, fh->get_access (), mode & O_TEXT ?: O_BINARY);
|
||||
if (flags & O_NOINHERIT)
|
||||
close_on_exec (true);
|
||||
uninterruptible_io (fh->uninterruptible_io ());
|
||||
cfree (fh);
|
||||
CloseHandle (proc);
|
||||
@@ -312,7 +309,7 @@ int
|
||||
fhandler_pipe::create (fhandler_pipe *fhs[2], unsigned psize, int mode)
|
||||
{
|
||||
HANDLE r, w;
|
||||
SECURITY_ATTRIBUTES *sa = (mode & O_NOINHERIT) ? &sec_none_nih : &sec_none;
|
||||
SECURITY_ATTRIBUTES *sa = sec_none_cloexec (mode);
|
||||
int res;
|
||||
|
||||
int ret = create_selectable (sa, r, w, psize);
|
||||
@@ -409,3 +406,9 @@ _pipe (int filedes[2], unsigned int psize, int mode)
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
extern "C" int
|
||||
pipe2 (int filedes[2], int mode)
|
||||
{
|
||||
return _pipe (filedes, DEFAULT_PIPEBUFSIZE, mode);
|
||||
}
|
||||
|
Reference in New Issue
Block a user