init.c (__gnat_error_handler): Instead of trying to read the memory before the faulti...
authorPascal Obry <obry@gnat.com>
Wed, 27 Oct 2004 13:05:35 +0000 (15:05 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 27 Oct 2004 13:05:35 +0000 (15:05 +0200)
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

gcc/ada/init.c

index e79ce9f7190783a5d455b85637e952cb9343b975..30a2098cb4c2383827953ff43bef0dd833ea25e9 100644 (file)
@@ -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 */
 }