aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPascal Obry <obry@gnat.com>2004-10-27 15:05:35 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2004-10-27 15:05:35 +0200
commit07f37402ebf4619b09f8a2886e08ea0dd44b5089 (patch)
treee94e3096571848eaacf452edaaf1c147ce78e966
parent3f02ce5de478bdaf2769969d37c2e7c0d5a03ce9 (diff)
downloadgcc-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.c18
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 */
}