emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r117748: Fix some glitches in previous change.


From: Dmitry Antipov
Subject: [Emacs-diffs] trunk r117748: Fix some glitches in previous change.
Date: Wed, 27 Aug 2014 04:15:49 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 117748
revision-id: address@hidden
parent: address@hidden
committer: Dmitry Antipov <address@hidden>
branch nick: trunk
timestamp: Wed 2014-08-27 08:15:20 +0400
message:
  Fix some glitches in previous change.
  * sysdep.c (stack_direction): Replace stack_grows_down
  to simplify calculation of stack boundaries.
  (handle_sigsegv): Check whether we really crash somewhere near
  to stack boundary, and handle fatal signal as usual if not.
  (init_sigsegv): Adjust accordingly.
modified:
  src/ChangeLog                  changelog-20091113204419-o5vbwnq5f7feedwu-1438
  src/keyboard.c                 keyboard.c-20091113204419-o5vbwnq5f7feedwu-449
  src/sysdep.c                   sysdep.c-20091113204419-o5vbwnq5f7feedwu-448
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2014-08-26 17:55:07 +0000
+++ b/src/ChangeLog     2014-08-27 04:15:20 +0000
@@ -1,3 +1,12 @@
+2014-08-27  Dmitry Antipov  <address@hidden>
+
+       Fix some glitches in previous change.
+       * sysdep.c (stack_direction): Replace stack_grows_down
+       to simplify calculation of stack boundaries.
+       (handle_sigsegv): Check whether we really crash somewhere near
+       to stack boundary, and handle fatal signal as usual if not.
+       (init_sigsegv): Adjust accordingly.
+
 2014-08-26  Dmitry Antipov  <address@hidden>
 
        Handle C stack overflow caused by too nested Lisp evaluation.

=== modified file 'src/keyboard.c'
--- a/src/keyboard.c    2014-08-26 06:25:59 +0000
+++ b/src/keyboard.c    2014-08-27 04:15:20 +0000
@@ -11028,7 +11028,7 @@
 #ifdef HAVE_STACK_OVERFLOW_HANDLING
   recover_top_level_message
     = build_pure_c_string ("Re-entering top level after C stack overflow");
-#endif  
+#endif
   DEFVAR_LISP ("top-level-message", Vtop_level_message,
               doc: /* Message displayed by `normal-top-level'.  */);
   Vtop_level_message = regular_top_level_message;

=== modified file 'src/sysdep.c'
--- a/src/sysdep.c      2014-08-26 08:01:48 +0000
+++ b/src/sysdep.c      2014-08-27 04:15:20 +0000
@@ -1720,9 +1720,9 @@
 
 #ifdef HAVE_STACK_OVERFLOW_HANDLING
 
-/* True if stack grows down as expected on most OS/ABI variants.  */
+/* -1 if stack grows down as expected on most OS/ABI variants, 1 otherwise.  */
 
-static bool stack_grows_down;
+static int stack_direction;
 
 /* Alternate stack used by SIGSEGV handler below.  */
 
@@ -1741,17 +1741,25 @@
 
       if (!getrlimit (RLIMIT_STACK, &rlim))
        {
-         enum { STACK_EXTRA = 16 * 1024 };
-         char *fault_addr = (char *) siginfo->si_addr;
-         unsigned long used = (stack_grows_down
-                               ? stack_bottom - fault_addr
-                               : fault_addr - stack_bottom);
+         enum { STACK_DANGER_ZONE = 16 * 1024 };
+         char *beg, *end, *addr;
 
-         if (used + STACK_EXTRA > rlim.rlim_cur)
-           /* Most likely this is it.  */
+         beg = stack_bottom;
+         end = stack_bottom + stack_direction * rlim.rlim_cur;
+         if (beg > end)
+           addr = beg, beg = end, end = addr;
+         addr = (char *) siginfo->si_addr;
+         /* If we're somewhere on stack and too close to
+            one of its boundaries, most likely this is it.  */
+         if (beg < addr && addr < end
+             && (addr - beg < STACK_DANGER_ZONE
+                 || end - addr < STACK_DANGER_ZONE))
            siglongjmp (return_to_command_loop, 1);
        }
     }
+
+  /* Otherwise we can't do anything with this.  */
+  deliver_fatal_thread_signal (sig);
 }
 
 /* Return true if we have successfully set up SIGSEGV handler on alternate
@@ -1763,7 +1771,7 @@
   struct sigaction sa;
   stack_t ss;
 
-  stack_grows_down = ((char *) &ss < stack_bottom);
+  stack_direction = ((char *) &ss < stack_bottom) ? -1 : 1;
 
   ss.ss_sp = sigsegv_stack;
   ss.ss_size = sizeof (sigsegv_stack);


reply via email to

[Prev in Thread] Current Thread [Next in Thread]