From 9e625b99e63a96ea5e0641e8fe9f4dc3559a07e2 Mon Sep 17 00:00:00 2001 From: cgf Date: Tue, 26 Jun 2001 21:03:08 +0000 Subject: [PATCH] * fhandler.cc (fhandler_disk_file::fstat): Don't rely on exactly 3 characters being read for executable test since we could be checking for less than that. * syscalls.cc (stat_worker): Try opening the file the "correct" way first so that #! processing can potentially happen. If that fails, then use "query open" method. * spawn.cc (spawn_guts): Delay processing of signal until after we've notified parent about reparenting. --- winsup/cygwin/ChangeLog | 12 ++++++++++++ winsup/cygwin/fhandler.cc | 4 ++-- winsup/cygwin/spawn.cc | 8 ++++++-- winsup/cygwin/syscalls.cc | 9 ++++++++- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index b1f56ed0d6..a04141e662 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +Tue Jun 26 16:59:16 2001 Christopher Faylor + + * fhandler.cc (fhandler_disk_file::fstat): Don't rely on exactly 3 + characters being read for executable test since we could be checking + for less than that. + * syscalls.cc (stat_worker): Try opening the file the "correct" way + first so that #! processing can potentially happen. If that fails, + then use "query open" method. + + * spawn.cc (spawn_guts): Delay processing of signal until after we've + notified parent about reparenting. + Tue Jun 26 10:47:24 2001 Christopher Faylor * mmap.cc: Clean up *ResourceLock calls throughout. diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc index 6c745c0972..65ef21411f 100644 --- a/winsup/cygwin/fhandler.cc +++ b/winsup/cygwin/fhandler.cc @@ -993,8 +993,8 @@ fhandler_disk_file::fstat (struct stat *buf) { /* FIXME should we use /etc/magic ? */ magic[0] = magic[1] = magic[2] = '\0'; - if (ReadFile (get_handle (), magic, 3, &done, 0) && - done == 3 && has_exec_chars (magic, done)) + if (ReadFile (get_handle (), magic, 3, &done, NULL) && + has_exec_chars (magic, done)) set_execable_p (); SetFilePointer (get_handle(), cur, NULL, FILE_BEGIN); } diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index db2603e307..d461e532b1 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -743,6 +743,7 @@ skip_arg_parsing: HANDLE waitbuf[3] = {pi.hProcess, signal_arrived, spr}; int nwait = 3; + bool saw_signal = 0; res = 0; exited = FALSE; @@ -761,8 +762,8 @@ skip_arg_parsing: break; case WAIT_OBJECT_0 + 1: sigproc_printf ("signal arrived"); - // reset_signal_arrived (); - thisframe.call_signal_handler (); + reset_signal_arrived (); + saw_signal = 1; continue; case WAIT_OBJECT_0 + 2: if (mode == _P_OVERLAY) @@ -820,6 +821,9 @@ skip_arg_parsing: } } + if (saw_signal && mode != _P_OVERLAY) + thisframe.call_signal_handler (); + MALLOC_CHECK; switch (mode) diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 23b6540e39..8b1a41e1e8 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -1069,9 +1069,16 @@ stat_worker (const char *caller, const char *name, struct stat *buf, && dtype != DRIVE_NO_ROOT_DIR && dtype != DRIVE_UNKNOWN))) { - fh.set_query_open (TRUE); oret = fh.open (real_path, O_RDONLY | O_BINARY | O_DIROPEN | (nofollow ? O_NOSYMLINK : 0), 0); + /* If we couldn't open the file, try a "query open" with no permissions. + This will allow us to determine *some* things about the file, at least. */ + if (!oret) + { + fh.set_query_open (TRUE); + oret = fh.open (real_path, O_RDONLY | O_BINARY | O_DIROPEN | + (nofollow ? O_NOSYMLINK : 0), 0); + } /* Check a special case here. If ntsec is ON it happens that a process creates a file using mode 000 to disallow other processes access. In contrast to UNIX, this results -- 2.11.0