u3: return 0 from u3e_fault() if guard page cannot be protected

This commit is contained in:
Peter McEvoy 2022-07-07 09:39:35 -07:00
parent b7cd97664d
commit abe5788daf

View File

@ -190,7 +190,7 @@ _ce_mapfree(void* map_v)
//! Place a guard page at the (approximate) middle of the free space between
//! the heap and stack of the current road, bailing if memory has been
//! exhausted.
static void
static c3_i
_ce_center_guard_page(void)
{
u3p(c3_w) bot_p, top_p;
@ -210,7 +210,7 @@ _ce_center_guard_page(void)
if ( top_p < bot_p + pag_wiz_i ) {
fprintf(stderr,
"loom: not enough memory to recenter the guard page\r\n");
goto fail;
goto bail;
}
const u3p(c3_w) old_gar_p = gar_pag_p;
const c3_w mid_p = (top_p - bot_p) / 2;
@ -220,7 +220,7 @@ _ce_center_guard_page(void)
"loom: can't move the guard page to the same location"
" (base address %p)\r\n",
u3a_into(gar_pag_p));
goto fail;
goto bail;
}
if ( -1 == mprotect(u3a_into(gar_pag_p), pag_siz_i, PROT_NONE) ) {
@ -228,15 +228,15 @@ _ce_center_guard_page(void)
"loom: failed to protect the guard page "
"(base address %p)\r\n",
u3a_into(gar_pag_p));
// XX this should probably return 0 through the libsigsegv protocol
// -- we couldn't handle the fault
c3_assert(0);
goto fail;
}
return;
return 1;
fail:
bail:
u3m_signal(c3__meme);
fail:
return 0;
}
#endif /* ifdef U3_GUARD_PAGE */
@ -270,7 +270,9 @@ u3e_fault(void* adr_v, c3_i ser_i)
#ifdef U3_GUARD_PAGE
// The fault happened in the guard page.
if ( gar_pag_p <= adr_p && adr_p < gar_pag_p + pag_wiz_i ) {
_ce_center_guard_page();
if ( 0 == _ce_center_guard_page() ) {
return 0;
}
}
else
#endif /* ifdef U3_GUARD_PAGE */