* exceptions.cc (interruptible): Remove obsolete tests.
(sigreturn): Construct pseudo-frame-pointer so that signal handler can figure out where to put return address when signals are coming in quickly. * path.cc (cwdstuff::get): Allow length 0 buffer length when buffer when NULL.
This commit is contained in:
parent
69f9407faa
commit
e2fa502354
|
@ -1,3 +1,12 @@
|
||||||
|
Wed Nov 1 21:08:23 2000 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
|
* exceptions.cc (interruptible): Remove obsolete tests.
|
||||||
|
(sigreturn): Construct pseudo-frame-pointer so that signal handler can
|
||||||
|
figure out where to put return address when signals are coming in
|
||||||
|
quickly.
|
||||||
|
* path.cc (cwdstuff::get): Allow length 0 buffer length when buffer
|
||||||
|
when NULL.
|
||||||
|
|
||||||
Tue Oct 31 18:12:56 2000 Christopher Faylor <cgf@cygnus.com>
|
Tue Oct 31 18:12:56 2000 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
* path.h (has_exec_chars): Standard function for checking for
|
* path.h (has_exec_chars): Standard function for checking for
|
||||||
|
|
|
@ -30,7 +30,6 @@ static int handle_exceptions (EXCEPTION_RECORD *, void *, CONTEXT *, void *);
|
||||||
extern void sigreturn ();
|
extern void sigreturn ();
|
||||||
extern void sigdelayed ();
|
extern void sigdelayed ();
|
||||||
extern void siglast ();
|
extern void siglast ();
|
||||||
extern DWORD __sigfirst, __siglast;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern DWORD sigtid;
|
extern DWORD sigtid;
|
||||||
|
@ -580,37 +579,34 @@ int
|
||||||
interruptible (DWORD pc, int testvalid = 0)
|
interruptible (DWORD pc, int testvalid = 0)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
if ((pc >= (DWORD) &__sigfirst) && (pc <= (DWORD) &__siglast))
|
MEMORY_BASIC_INFORMATION m;
|
||||||
|
|
||||||
|
memset (&m, 0, sizeof m);
|
||||||
|
if (!VirtualQuery ((LPCVOID) pc, &m, sizeof m))
|
||||||
|
sigproc_printf ("couldn't get memory info, pc %p, %E", pc);
|
||||||
|
|
||||||
|
char *checkdir = (char *) alloca (windows_system_directory_length + 4);
|
||||||
|
memset (checkdir, 0, sizeof (checkdir));
|
||||||
|
|
||||||
|
# define h ((HMODULE) m.AllocationBase)
|
||||||
|
/* Apparently Windows 95 can sometimes return bogus addresses from
|
||||||
|
GetThreadContext. These resolve to an allocation base == 0.
|
||||||
|
These should *never* be treated as interruptible. */
|
||||||
|
if (!h || m.State != MEM_COMMIT)
|
||||||
|
res = 0;
|
||||||
|
else if (testvalid)
|
||||||
|
res = 1; /* All we wanted to know was if this was a valid module. */
|
||||||
|
else if (h == user_data->hmodule)
|
||||||
|
res = 1;
|
||||||
|
else if (h == cygwin_hmodule)
|
||||||
|
res = 0;
|
||||||
|
else if (!GetModuleFileName (h, checkdir, windows_system_directory_length + 2))
|
||||||
res = 0;
|
res = 0;
|
||||||
else
|
else
|
||||||
{
|
res = !strncasematch (windows_system_directory, checkdir,
|
||||||
MEMORY_BASIC_INFORMATION m;
|
windows_system_directory_length);
|
||||||
memset (&m, 0, sizeof m);
|
minimal_printf ("h %p", h);
|
||||||
if (!VirtualQuery ((LPCVOID) pc, &m, sizeof m))
|
# undef h
|
||||||
sigproc_printf ("couldn't get memory info, pc %p, %E", pc);
|
|
||||||
|
|
||||||
char *checkdir = (char *) alloca (windows_system_directory_length + 4);
|
|
||||||
memset (checkdir, 0, sizeof (checkdir));
|
|
||||||
# define h ((HMODULE) m.AllocationBase)
|
|
||||||
/* Apparently Windows 95 can sometimes return bogus addresses from
|
|
||||||
GetThreadContext. These resolve to an allocation base == 0.
|
|
||||||
These should *never* be treated as interruptible. */
|
|
||||||
if (!h || m.State != MEM_COMMIT)
|
|
||||||
res = 0;
|
|
||||||
else if (testvalid)
|
|
||||||
res = 1; /* All we wanted to know was if this was a valid module. */
|
|
||||||
else if (h == user_data->hmodule)
|
|
||||||
res = 1;
|
|
||||||
else if (h == cygwin_hmodule)
|
|
||||||
res = 0;
|
|
||||||
else if (!GetModuleFileName (h, checkdir, windows_system_directory_length + 2))
|
|
||||||
res = 0;
|
|
||||||
else
|
|
||||||
res = !strncasematch (windows_system_directory, checkdir,
|
|
||||||
windows_system_directory_length);
|
|
||||||
minimal_printf ("h %p", h);
|
|
||||||
# undef h
|
|
||||||
}
|
|
||||||
|
|
||||||
minimal_printf ("interruptible %d", res);
|
minimal_printf ("interruptible %d", res);
|
||||||
return res;
|
return res;
|
||||||
|
@ -1040,6 +1036,7 @@ signal_exit (int rc)
|
||||||
if (hExeced)
|
if (hExeced)
|
||||||
TerminateProcess (hExeced, rc);
|
TerminateProcess (hExeced, rc);
|
||||||
|
|
||||||
|
sigproc_printf ("about to call do_exit (%x)", rc);
|
||||||
do_exit (rc);
|
do_exit (rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1082,8 +1079,7 @@ events_terminate (void)
|
||||||
|
|
||||||
#define pid_offset (unsigned)(((_pinfo *)NULL)->pid)
|
#define pid_offset (unsigned)(((_pinfo *)NULL)->pid)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
static void __stdcall
|
static void __stdcall reset_signal_arrived () __attribute__ ((unused));
|
||||||
reset_signal_arrived () __attribute__ ((unused));
|
|
||||||
static void __stdcall
|
static void __stdcall
|
||||||
reset_signal_arrived ()
|
reset_signal_arrived ()
|
||||||
{
|
{
|
||||||
|
@ -1102,6 +1098,8 @@ __asm__ volatile ("
|
||||||
|
|
||||||
_sigreturn:
|
_sigreturn:
|
||||||
addl $4,%%esp
|
addl $4,%%esp
|
||||||
|
movl %%esp,%%ebp
|
||||||
|
addl $36,%%ebp
|
||||||
call _set_process_mask@4
|
call _set_process_mask@4
|
||||||
popl %%eax # saved errno
|
popl %%eax # saved errno
|
||||||
testl %%eax,%%eax # Is it < 0
|
testl %%eax,%%eax # Is it < 0
|
||||||
|
@ -1114,12 +1112,14 @@ _sigreturn:
|
||||||
popl %%edx
|
popl %%edx
|
||||||
popl %%edi
|
popl %%edi
|
||||||
popl %%esi
|
popl %%esi
|
||||||
|
popl %%ebp
|
||||||
popf
|
popf
|
||||||
ret
|
ret
|
||||||
|
|
||||||
_sigdelayed:
|
_sigdelayed:
|
||||||
pushl %2 # original return address
|
pushl %2 # original return address
|
||||||
pushf
|
pushf
|
||||||
|
pushl %%ebp
|
||||||
pushl %%esi
|
pushl %%esi
|
||||||
pushl %%edi
|
pushl %%edi
|
||||||
pushl %%edx
|
pushl %%edx
|
||||||
|
@ -1136,10 +1136,8 @@ _sigdelayed:
|
||||||
|
|
||||||
cmpl $0,_pending_signals
|
cmpl $0,_pending_signals
|
||||||
je 2f
|
je 2f
|
||||||
___sigfirst:
|
|
||||||
pushl $0
|
pushl $0
|
||||||
call _sig_dispatch_pending@4
|
call _sig_dispatch_pending@4
|
||||||
___siglast:
|
|
||||||
|
|
||||||
2: jmp *%5
|
2: jmp *%5
|
||||||
|
|
||||||
|
|
|
@ -2899,7 +2899,11 @@ cwdstuff::get (char *buf, int need_posix, int with_chroot, unsigned ulen)
|
||||||
{
|
{
|
||||||
MALLOC_CHECK;
|
MALLOC_CHECK;
|
||||||
|
|
||||||
if (ulen == 0)
|
if (ulen)
|
||||||
|
/* nothing */;
|
||||||
|
else if (buf == NULL)
|
||||||
|
ulen = (unsigned) -1;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
set_errno (EINVAL);
|
set_errno (EINVAL);
|
||||||
goto out;
|
goto out;
|
||||||
|
|
Loading…
Reference in New Issue