]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Merge from trunk, r11523 and r11524 (fixes for #246152, segfault on
authorJulian Seward <jseward@acm.org>
Mon, 14 Feb 2011 11:10:53 +0000 (11:10 +0000)
committerJulian Seward <jseward@acm.org>
Mon, 14 Feb 2011 11:10:53 +0000 (11:10 +0000)
pthread_cancel)

git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_3_6_BRANCH@11554

callgrind/bbcc.c
callgrind/callstack.c
callgrind/global.h
callgrind/jumps.c

index 24862a80caaacbee8ba9fef40a36856f2c4ec05e..bab48585445c078db770e4b7dd68be5b030760b6 100644 (file)
@@ -741,7 +741,11 @@ void CLG_(setup_bbcc)(BB* bb)
     }
   }
   else {
-    CLG_(unwind_call_stack)(sp, 0);
+    Int unwind_count = CLG_(unwind_call_stack)(sp, 0);
+    if (unwind_count > 0) {
+      /* if unwinding was done, this actually is a return */
+      jmpkind = Ijk_Ret;
+    }
     
     if (jmpkind == Ijk_Call) {
       delayed_push = True;
index 24087f5bc38b68c387bec51157ea39a608234a19..ec48369c730f9b13d35b17e685b1ebb85ffe0a27 100644 (file)
@@ -394,11 +394,13 @@ void CLG_(pop_call_stack)()
 }
 
 
-/* remove CallStack items to sync with current SP
+/* Unwind enough CallStack items to sync with current stack pointer.
+ * Returns the number of stack frames unwinded.
  */
-void CLG_(unwind_call_stack)(Addr sp, Int minpops)
+Int CLG_(unwind_call_stack)(Addr sp, Int minpops)
 {
     Int csp;
+    Int unwind_count = 0;
     CLG_DEBUG(4,"+ unwind_call_stack(sp %#lx, minpops %d): frame %d\n",
              sp, minpops, CLG_(current_call_stack).sp);
 
@@ -415,6 +417,7 @@ void CLG_(unwind_call_stack)(Addr sp, Int minpops)
            ((top_ce->sp == sp) && minpops>0)) {
 
            minpops--;
+           unwind_count++;
            CLG_(pop_call_stack)();
            csp=CLG_(current_call_stack).sp;
            continue;
@@ -423,4 +426,5 @@ void CLG_(unwind_call_stack)(Addr sp, Int minpops)
     }
 
     CLG_DEBUG(4,"- unwind_call_stack\n");
+    return unwind_count;
 }
index bfb5a48168cf7a31e604bd98e61add5d5ee2d766..d66e631e31d188559fa9fefd635921d96bdb10d6 100644 (file)
@@ -779,7 +779,7 @@ call_entry* CLG_(get_call_entry)(Int n);
 
 void CLG_(push_call_stack)(BBCC* from, UInt jmp, BBCC* to, Addr sp, Bool skip);
 void CLG_(pop_call_stack)(void);
-void CLG_(unwind_call_stack)(Addr sp, Int);
+Int CLG_(unwind_call_stack)(Addr sp, Int);
 
 /* from context.c */
 void CLG_(init_fn_stack)(fn_stack*);
index fc306af0d562b6caf1a7e812148ef5e8b126b7fa..50b35af2a40fa8e872e8f95f56ae189e089cd7bd 100644 (file)
@@ -160,6 +160,8 @@ static jCC* new_jcc(BBCC* from, UInt jmp, BBCC* to)
     * This list is only used at dumping time */
 
    if (from) {
+       /* Prohibit corruption by array overrun */
+       CLG_ASSERT((0 <= jmp) && (jmp <= from->bb->cjmp_count));
        jcc->next_from = from->jmp[jmp].jcc_list;
        from->jmp[jmp].jcc_list = jcc;
    }