changeset 73:63b7632cf097 default tip

Bug 3421: Override functions might crash on Fedora 26 Reviewed-by: ykubota https://github.com/HeapStats/heapstats/pull/110
author Yasumasa Suenaga <yasuenag@gmail.com>
date Tue, 18 Jul 2017 11:54:21 +0900
parents 842b6988ed87
children
files agent/ChangeLog agent/src/overrideFunc.S
diffstat 2 files changed, 19 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/agent/ChangeLog	Wed Jul 05 14:07:40 2017 +0900
+++ b/agent/ChangeLog	Tue Jul 18 11:54:21 2017 +0900
@@ -1,3 +1,7 @@
+2017-07-18 Yasumasa Suenaga  <yasuenag@gmail.com>
+
+	* Bug 3421: Override functions might crash on Fedora 26
+
 2017-07-05 KUBOTA Yuji <kubota.yuji@lab.ntt.co.jp>
 
 	* Bump to 1.1.7
--- a/agent/src/overrideFunc.S	Wed Jul 05 14:07:40 2017 +0900
+++ b/agent/src/overrideFunc.S	Tue Jul 18 11:54:21 2017 +0900
@@ -27,7 +27,9 @@
 #define OVERRIDE_FUNC_DEFINE(header, ary_idx) \
         .global header##_override_func_##ary_idx ;         \
         .type header##_override_func_##ary_idx, @function; \
-    header##_override_func_##ary_idx: ;
+    header##_override_func_##ary_idx: ;                    \
+    push %rbp;                                             \
+    mov %rsp, %rbp;
 
 #if defined(__amd64__)
     
@@ -79,7 +81,7 @@
         pop %r11;        \
         test %r11, %r11; \
         jz nextFunc;     \
-        call *%r11;      
+        call *%r11;
     
     /* Macro for override function define. */
     
@@ -166,6 +168,8 @@
     
     #define OVERRIDE_CALLBACK_DEFINE(header, ary_idx, func, paramCnt) \
         OVERRIDE_FUNC_DEFINE(header, ary_idx)      \
+        /* Stack alignment */                      \
+        sub $8, %rsp;                              \
                                                    \
         /* Get all override info. */ ;             \
         GET_ALL_FUNC_ADDR(header, ary_idx)         \
@@ -469,6 +473,10 @@
 #if defined(__amd64__)
     pop %r11;
     DO_LOAD_REG
+    /* Restore stack pointer */
+    mov %rbp, %rsp;
+    /* Restore base pointer */
+    pop %rbp;
     jmp *%r11;
 #elif defined(__i386__)
     addl $0x4, %esp;
@@ -479,6 +487,11 @@
 
 .RETURN_CALLER_FUNC:;
 #if defined(__amd64__)
+    /* Restore stack pointer */
+    mov %rbp, %rsp;
+    /* Restore base pointer */
+    pop %rbp;
+
     /*
      * Return caller. Return address exists on top of stack.
      * We need to pop return address from stack.