mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Improve error message for segv in read_barrier_handler
If the page_body is a null pointer, then read_barrier_handler will crash with an unrelated message. This commit improves the error message. Before: test.rb:1: [BUG] Couldn't unprotect page 0x0000000000000000, errno: Cannot allocate memory After: test.rb:1: [BUG] read_barrier_handler: segmentation fault at 0x14
This commit is contained in:
parent
d6c98626da
commit
f36859869f
Notes:
git
2022-07-07 22:39:49 +09:00
1 changed files with 12 additions and 3 deletions
15
gc.c
15
gc.c
|
@ -5210,18 +5210,27 @@ static void invalidate_moved_page(rb_objspace_t *objspace, struct heap_page *pag
|
||||||
|
|
||||||
#if GC_CAN_COMPILE_COMPACTION
|
#if GC_CAN_COMPILE_COMPACTION
|
||||||
static void
|
static void
|
||||||
read_barrier_handler(uintptr_t address)
|
read_barrier_handler(uintptr_t original_address)
|
||||||
{
|
{
|
||||||
VALUE obj;
|
VALUE obj;
|
||||||
rb_objspace_t * objspace = &rb_objspace;
|
rb_objspace_t * objspace = &rb_objspace;
|
||||||
|
|
||||||
address -= address % BASE_SLOT_SIZE;
|
/* Calculate address aligned to slots. */
|
||||||
|
uintptr_t address = original_address - (original_address % BASE_SLOT_SIZE);
|
||||||
|
|
||||||
obj = (VALUE)address;
|
obj = (VALUE)address;
|
||||||
|
|
||||||
|
struct heap_page_body *page_body = GET_PAGE_BODY(obj);
|
||||||
|
|
||||||
|
/* If the page_body is NULL, then mprotect cannot handle it and will crash
|
||||||
|
* with "Cannot allocate memory". */
|
||||||
|
if (page_body == NULL) {
|
||||||
|
rb_bug("read_barrier_handler: segmentation fault at 0x%lx", original_address);
|
||||||
|
}
|
||||||
|
|
||||||
RB_VM_LOCK_ENTER();
|
RB_VM_LOCK_ENTER();
|
||||||
{
|
{
|
||||||
unlock_page_body(objspace, GET_PAGE_BODY(obj));
|
unlock_page_body(objspace, page_body);
|
||||||
|
|
||||||
objspace->profile.read_barrier_faults++;
|
objspace->profile.read_barrier_faults++;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue