diff options
author | Pascal Obry <obry@gnat.com> | 2004-10-27 15:05:35 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2004-10-27 15:05:35 +0200 |
commit | 07f37402ebf4619b09f8a2886e08ea0dd44b5089 (patch) | |
tree | e94e3096571848eaacf452edaaf1c147ce78e966 | |
parent | 3f02ce5de478bdaf2769969d37c2e7c0d5a03ce9 (diff) | |
download | gcc-07f37402ebf4619b09f8a2886e08ea0dd44b5089.zip gcc-07f37402ebf4619b09f8a2886e08ea0dd44b5089.tar.gz gcc-07f37402ebf4619b09f8a2886e08ea0dd44b5089.tar.bz2 |
init.c (__gnat_error_handler): Instead of trying to read the memory before the faulting page we properly test...
2004-10-26 Pascal Obry <obry@gnat.com>
* init.c (__gnat_error_handler) [Win32]: Instead of trying to read the
memory before the faulting page we properly test the process read
access for this address using appropriate Win32 routine.
(HPUX sections): guard with "__hpux__" instead of "hpux".
From-SVN: r89656
-rw-r--r-- | gcc/ada/init.c | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/gcc/ada/init.c b/gcc/ada/init.c index e79ce9f..30a2098 100644 --- a/gcc/ada/init.c +++ b/gcc/ada/init.c @@ -575,7 +575,7 @@ __gnat_machine_state_length (void) /* __gnat_initialize (HPUX Version) */ /************************************/ -#elif defined (hpux) +#elif defined (__hpux__) #include <signal.h> @@ -824,28 +824,25 @@ static LONG WINAPI __gnat_error_handler (PEXCEPTION_POINTERS); static LONG WINAPI __gnat_error_handler (PEXCEPTION_POINTERS info) { - static int recurse; struct Exception_Data *exception; const char *msg; switch (info->ExceptionRecord->ExceptionCode) { case EXCEPTION_ACCESS_VIOLATION: - /* If the failing address isn't maximally-aligned or if we've - recursed, this is a program error. */ + /* If the failing address isn't maximally-aligned or if the page + before the faulting page is not accessible, this is a program error. + */ if ((info->ExceptionRecord->ExceptionInformation[1] & 3) != 0 - || recurse) + || IsBadCodePtr + ((void *)(info->ExceptionRecord->ExceptionInformation[1] + 4096))) { exception = &program_error; msg = "EXCEPTION_ACCESS_VIOLATION"; } else { - /* See if the page before the faulting page is accessible. Do that - by trying to access it. */ - recurse++; - * ((volatile char *) (info->ExceptionRecord->ExceptionInformation[1] - + 4096)); + /* otherwise it is a stack overflow */ exception = &storage_error; msg = "stack overflow (or erroneous memory access)"; } @@ -931,7 +928,6 @@ __gnat_error_handler (PEXCEPTION_POINTERS info) msg = "unhandled signal"; } - recurse = 0; Raise_From_Signal_Handler (exception, msg); return 0; /* This is never reached, avoid compiler warning */ } |