Tue, 25 Jun 2013 17:22:04 -0400
8017478: Kitchensink crashed with SIGSEGV in BaselineReporter::diff_callsites
Summary: Fixed possible NULL pointer that caused SIGSEGV
Reviewed-by: coleenp, acorn, ctornqvi
src/share/vm/services/memReporter.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/services/memReporter.cpp Sun Jun 23 22:08:28 2013 -0700 1.2 +++ b/src/share/vm/services/memReporter.cpp Tue Jun 25 17:22:04 2013 -0400 1.3 @@ -188,8 +188,8 @@ 1.4 (MallocCallsitePointer*)prev_malloc_itr.current(); 1.5 1.6 while (cur_malloc_callsite != NULL || prev_malloc_callsite != NULL) { 1.7 - if (prev_malloc_callsite == NULL || 1.8 - cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) { 1.9 + if (prev_malloc_callsite == NULL) { 1.10 + assert(cur_malloc_callsite != NULL, "sanity check"); 1.11 // this is a new callsite 1.12 _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), 1.13 amount_in_current_scale(cur_malloc_callsite->amount()), 1.14 @@ -197,22 +197,42 @@ 1.15 diff_in_current_scale(cur_malloc_callsite->amount(), 0), 1.16 diff(cur_malloc_callsite->count(), 0)); 1.17 cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); 1.18 - } else if (cur_malloc_callsite == NULL || 1.19 - cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) { 1.20 + } else if (cur_malloc_callsite == NULL) { 1.21 + assert(prev_malloc_callsite != NULL, "Sanity check"); 1.22 // this callsite is already gone 1.23 _outputer.diff_malloc_callsite(prev_malloc_callsite->addr(), 1.24 - amount_in_current_scale(0), 0, 1.25 + 0, 0, 1.26 diff_in_current_scale(0, prev_malloc_callsite->amount()), 1.27 diff(0, prev_malloc_callsite->count())); 1.28 prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); 1.29 - } else { // the same callsite 1.30 - _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), 1.31 - amount_in_current_scale(cur_malloc_callsite->amount()), 1.32 - cur_malloc_callsite->count(), 1.33 - diff_in_current_scale(cur_malloc_callsite->amount(), prev_malloc_callsite->amount()), 1.34 - diff(cur_malloc_callsite->count(), prev_malloc_callsite->count())); 1.35 - cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); 1.36 - prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); 1.37 + } else { 1.38 + assert(cur_malloc_callsite != NULL, "Sanity check"); 1.39 + assert(prev_malloc_callsite != NULL, "Sanity check"); 1.40 + if (cur_malloc_callsite->addr() < prev_malloc_callsite->addr()) { 1.41 + // this is a new callsite 1.42 + _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), 1.43 + amount_in_current_scale(cur_malloc_callsite->amount()), 1.44 + cur_malloc_callsite->count(), 1.45 + diff_in_current_scale(cur_malloc_callsite->amount(), 0), 1.46 + diff(cur_malloc_callsite->count(), 0)); 1.47 + cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); 1.48 + } else if (cur_malloc_callsite->addr() > prev_malloc_callsite->addr()) { 1.49 + // this callsite is already gone 1.50 + _outputer.diff_malloc_callsite(prev_malloc_callsite->addr(), 1.51 + 0, 0, 1.52 + diff_in_current_scale(0, prev_malloc_callsite->amount()), 1.53 + diff(0, prev_malloc_callsite->count())); 1.54 + prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); 1.55 + } else { 1.56 + // the same callsite 1.57 + _outputer.diff_malloc_callsite(cur_malloc_callsite->addr(), 1.58 + amount_in_current_scale(cur_malloc_callsite->amount()), 1.59 + cur_malloc_callsite->count(), 1.60 + diff_in_current_scale(cur_malloc_callsite->amount(), prev_malloc_callsite->amount()), 1.61 + diff(cur_malloc_callsite->count(), prev_malloc_callsite->count())); 1.62 + cur_malloc_callsite = (MallocCallsitePointer*)cur_malloc_itr.next(); 1.63 + prev_malloc_callsite = (MallocCallsitePointer*)prev_malloc_itr.next(); 1.64 + } 1.65 } 1.66 } 1.67