Cygwin: proc fd: pass along open mode when reopening file

The reopen code neglected to pass along the requested open
mode correctly.  This may end up reopening the file with
incorrect access mask, or duplicating the wrong pipe handle.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2019-02-05 15:20:13 +01:00
parent 7225a82c1a
commit 1f6340aa8b
4 changed files with 6 additions and 6 deletions

View File

@ -792,7 +792,7 @@ done:
} }
fhandler_base * fhandler_base *
fhandler_base::fd_reopen (int) fhandler_base::fd_reopen (int, mode_t)
{ {
/* This is implemented in fhandler_process only. */ /* This is implemented in fhandler_process only. */
return NULL; return NULL;

View File

@ -331,7 +331,7 @@ class fhandler_base
int open_with_arch (int, mode_t = 0); int open_with_arch (int, mode_t = 0);
int open_null (int flags); int open_null (int flags);
virtual int open (int, mode_t); virtual int open (int, mode_t);
virtual fhandler_base *fd_reopen (int); virtual fhandler_base *fd_reopen (int, mode_t);
virtual void open_setup (int flags); virtual void open_setup (int flags);
void set_unique_id (int64_t u) { unique_id = u; } void set_unique_id (int64_t u) { unique_id = u; }
void set_unique_id () { NtAllocateLocallyUniqueId ((PLUID) &unique_id); } void set_unique_id () { NtAllocateLocallyUniqueId ((PLUID) &unique_id); }
@ -2587,7 +2587,7 @@ class fhandler_process_fd : public fhandler_process
fhandler_process_fd () : fhandler_process () {} fhandler_process_fd () : fhandler_process () {}
fhandler_process_fd (void *) {} fhandler_process_fd (void *) {}
virtual fhandler_base *fd_reopen (int); virtual fhandler_base *fd_reopen (int, mode_t);
int __reg2 fstat (struct stat *buf); int __reg2 fstat (struct stat *buf);
virtual int __reg2 link (const char *); virtual int __reg2 link (const char *);

View File

@ -97,7 +97,7 @@ fhandler_process_fd::fetch_fh (HANDLE &out_hdl, uint32_t flags)
} }
fhandler_base * fhandler_base *
fhandler_process_fd::fd_reopen (int flags) fhandler_process_fd::fd_reopen (int flags, mode_t mode)
{ {
fhandler_base *fh; fhandler_base *fh;
HANDLE hdl; HANDLE hdl;
@ -106,7 +106,7 @@ fhandler_process_fd::fd_reopen (int flags)
if (!fh) if (!fh)
return NULL; return NULL;
fh->set_io_handle (hdl); fh->set_io_handle (hdl);
int ret = fh->open_with_arch (flags, 0); int ret = fh->open_with_arch (flags, mode);
CloseHandle (hdl); CloseHandle (hdl);
if (!ret) if (!ret)
{ {

View File

@ -1507,7 +1507,7 @@ open (const char *unix_path, int flags, ...)
if (fh->dev () == FH_PROCESSFD && fh->pc.follow_fd_symlink ()) if (fh->dev () == FH_PROCESSFD && fh->pc.follow_fd_symlink ())
{ {
/* Reopen file by descriptor */ /* Reopen file by descriptor */
fh_file = fh->fd_reopen (flags); fh_file = fh->fd_reopen (flags, mode & 07777);
if (!fh_file) if (!fh_file)
__leave; __leave;
delete fh; delete fh;