* 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.
This commit is contained in:
Christopher Faylor 2001-06-26 21:03:08 +00:00
parent 32c3034969
commit 07c3cd5bb1
4 changed files with 28 additions and 5 deletions

View File

@ -1,3 +1,15 @@
Tue Jun 26 16:59:16 2001 Christopher Faylor <cgf@cygnus.com>
* 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 <cgf@cygnus.com> Tue Jun 26 10:47:24 2001 Christopher Faylor <cgf@cygnus.com>
* mmap.cc: Clean up *ResourceLock calls throughout. * mmap.cc: Clean up *ResourceLock calls throughout.

View File

@ -993,8 +993,8 @@ fhandler_disk_file::fstat (struct stat *buf)
{ {
/* FIXME should we use /etc/magic ? */ /* FIXME should we use /etc/magic ? */
magic[0] = magic[1] = magic[2] = '\0'; magic[0] = magic[1] = magic[2] = '\0';
if (ReadFile (get_handle (), magic, 3, &done, 0) && if (ReadFile (get_handle (), magic, 3, &done, NULL) &&
done == 3 && has_exec_chars (magic, done)) has_exec_chars (magic, done))
set_execable_p (); set_execable_p ();
SetFilePointer (get_handle(), cur, NULL, FILE_BEGIN); SetFilePointer (get_handle(), cur, NULL, FILE_BEGIN);
} }

View File

@ -743,6 +743,7 @@ skip_arg_parsing:
HANDLE waitbuf[3] = {pi.hProcess, signal_arrived, spr}; HANDLE waitbuf[3] = {pi.hProcess, signal_arrived, spr};
int nwait = 3; int nwait = 3;
bool saw_signal = 0;
res = 0; res = 0;
exited = FALSE; exited = FALSE;
@ -761,8 +762,8 @@ skip_arg_parsing:
break; break;
case WAIT_OBJECT_0 + 1: case WAIT_OBJECT_0 + 1:
sigproc_printf ("signal arrived"); sigproc_printf ("signal arrived");
// reset_signal_arrived (); reset_signal_arrived ();
thisframe.call_signal_handler (); saw_signal = 1;
continue; continue;
case WAIT_OBJECT_0 + 2: case WAIT_OBJECT_0 + 2:
if (mode == _P_OVERLAY) if (mode == _P_OVERLAY)
@ -820,6 +821,9 @@ skip_arg_parsing:
} }
} }
if (saw_signal && mode != _P_OVERLAY)
thisframe.call_signal_handler ();
MALLOC_CHECK; MALLOC_CHECK;
switch (mode) switch (mode)

View File

@ -1069,9 +1069,16 @@ stat_worker (const char *caller, const char *name, struct stat *buf,
&& dtype != DRIVE_NO_ROOT_DIR && dtype != DRIVE_NO_ROOT_DIR
&& dtype != DRIVE_UNKNOWN))) && dtype != DRIVE_UNKNOWN)))
{ {
fh.set_query_open (TRUE);
oret = fh.open (real_path, O_RDONLY | O_BINARY | O_DIROPEN | oret = fh.open (real_path, O_RDONLY | O_BINARY | O_DIROPEN |
(nofollow ? O_NOSYMLINK : 0), 0); (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 /* Check a special case here. If ntsec is ON it happens
that a process creates a file using mode 000 to disallow that a process creates a file using mode 000 to disallow
other processes access. In contrast to UNIX, this results other processes access. In contrast to UNIX, this results