Fix GC heap corruption on ARM. (#1389) accepted/tizen/5.5/unified/20200121.031421 submit/tizen_5.5/20200120.050447
authorAnton Lapounov <antonl@microsoft.com>
Wed, 8 Jan 2020 10:12:25 +0000 (02:12 -0800)
committerAlexander Soldatov/AI Compiler Lab /SRR/Staff Engineer/Samsung Electronics <soldatov.a@samsung.com>
Thu, 9 Jan 2020 13:48:46 +0000 (16:48 +0300)
commitba8e26eadf1a6f3534f5ef902e4045ad8b924809
tree6d3750416159957bd4605c07c36c8e3d191ee512
parent41b5d8ca351af198d29e1cbe0c56123eddd4f5b6
Fix GC heap corruption on ARM. (#1389)

The allocate_in_free code path in allocate_in_expanded_heap incorrectly calculated the large (double) alignment padding size when limiting the plug size (SHORT_PLUGS) if set_padding_on_saved_p was true:

    set_padding_in_expand (old_loc, set_padding_on_saved_p, pinned_plug_entry); // Sets the padding flag on the saved plug
    ...
    pad += switch_alignment_size (is_plug_padded (old_loc)); // Reads the padding flag from the old (different!) plug

That caused access violation during a later heap walk since the g_gc_pFreeObjectMethodTable pointer marking the gap was not placed at the right address.

Change-Id: I10a5fa443b3f5a614909983cd3c06d5420d22858
src/gc/gc.cpp