mirror of
https://github.com/urbit/ares.git
synced 2024-12-23 13:25:03 +03:00
wip: sts. vincent and anastasius
This commit is contained in:
parent
f7fcffc429
commit
cb73bcd8ca
File diff suppressed because it is too large
Load Diff
@ -14,19 +14,11 @@ static void *guard_p = NULL;
|
|||||||
static void *stack_p = NULL;
|
static void *stack_p = NULL;
|
||||||
static void *alloc_p = NULL;
|
static void *alloc_p = NULL;
|
||||||
|
|
||||||
typedef enum {
|
volatile sig_atomic_t err = guard_sound;
|
||||||
guard_sound = 0, // job's done
|
|
||||||
guard_armor = 1, // mprotect
|
|
||||||
guard_weird = 2, // strange state
|
|
||||||
guard_spent = 3, // out of memory (bail:meme)
|
|
||||||
guard_erupt = 4, // sigint
|
|
||||||
} guard_error;
|
|
||||||
|
|
||||||
volatile sig_atomic_t guard_err = guard_sound;
|
|
||||||
|
|
||||||
|
|
||||||
// Center the guard page.
|
// Center the guard page.
|
||||||
guard_error _focus_guard() {
|
guard_err _focus_guard() {
|
||||||
// Check for strange situations.
|
// Check for strange situations.
|
||||||
if (stack_p == NULL || alloc_p == NULL) {
|
if (stack_p == NULL || alloc_p == NULL) {
|
||||||
return guard_weird;
|
return guard_weird;
|
||||||
@ -62,7 +54,7 @@ guard_error _focus_guard() {
|
|||||||
return guard_sound;
|
return guard_sound;
|
||||||
}
|
}
|
||||||
|
|
||||||
guard_error _slash_guard(void *si_addr) {
|
guard_err _slash_guard(void *si_addr) {
|
||||||
if (si_addr >= guard_p && si_addr < guard_p + GD_PAGESIZE) {
|
if (si_addr >= guard_p && si_addr < guard_p + GD_PAGESIZE) {
|
||||||
return _focus_guard();
|
return _focus_guard();
|
||||||
}
|
}
|
||||||
@ -73,17 +65,17 @@ guard_error _slash_guard(void *si_addr) {
|
|||||||
void _signal_handler(int sig, siginfo_t *si, void *unused) {
|
void _signal_handler(int sig, siginfo_t *si, void *unused) {
|
||||||
switch (sig) {
|
switch (sig) {
|
||||||
case SIGSEGV:
|
case SIGSEGV:
|
||||||
guard_err = _slash_guard(si->si_addr);
|
err = _slash_guard(si->si_addr);
|
||||||
break;
|
break;
|
||||||
case SIGINT:
|
case SIGINT:
|
||||||
guard_err = guard_erupt;
|
err = guard_erupt;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
guard_error _register_handler() {
|
guard_err _register_handler() {
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
|
|
||||||
sa.sa_flags = SA_SIGINFO;
|
sa.sa_flags = SA_SIGINFO;
|
||||||
@ -97,28 +89,28 @@ guard_error _register_handler() {
|
|||||||
return guard_sound;
|
return guard_sound;
|
||||||
}
|
}
|
||||||
|
|
||||||
void guard(void *(*f)(void *), void *arg, void **stack, void **alloc, void **ret) {
|
void guard(void *(*f)(void *), void *arg, void *const *const stack, void *const *const alloc, void **ret) {
|
||||||
stack_p = *stack;
|
stack_p = *stack;
|
||||||
alloc_p = *alloc;
|
alloc_p = *alloc;
|
||||||
|
|
||||||
if (_register_handler() != guard_sound) {
|
if (_register_handler() != guard_sound) {
|
||||||
guard_err = guard_weird;
|
err = guard_weird;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (guard_p == NULL && (guard_err = _focus_guard()) != guard_sound) {
|
if (guard_p == NULL && (err = _focus_guard()) != guard_sound) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
*ret = f(arg);
|
*ret = f(arg);
|
||||||
|
|
||||||
if (guard_err != guard_sound) {
|
if (err != guard_sound) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
*ret = (void *) &guard_err;
|
*ret = (void *) &err;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,15 @@
|
|||||||
* error will be written to the `ret` pointer. The caller is then responsible
|
* error will be written to the `ret` pointer. The caller is then responsible
|
||||||
* for handling this error and aborting with a `bail:meme`.
|
* for handling this error and aborting with a `bail:meme`.
|
||||||
*/
|
*/
|
||||||
void guard(void *(*f)(void *), void *arg, void **stack, void **alloc, void **ret);
|
void guard(void *(*f)(void *), void *arg, void *const *const stack, void *const *const alloc, void **ret);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
guard_sound = 0, // job's done
|
||||||
|
guard_armor = 1, // mprotect
|
||||||
|
guard_weird = 2, // strange state
|
||||||
|
guard_spent = 3, // out of memory (bail:meme)
|
||||||
|
guard_erupt = 4, // sigint
|
||||||
|
} guard_err;
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user