[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);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] trunk r117748: Fix some glitches in previous change.,
Dmitry Antipov <=