ares icon indicating copy to clipboard operation
ares copied to clipboard

`mprotect()` `SIGINT`

Open ashelkovnykov opened this issue 2 years ago • 3 comments

The current implementation of handling SIGINT signals in Ares from king sets a sentinel value which is polled on every call to Nock 2, Nock 9, and push to mean stack. If the sentinel value is set, the event bails with a non-deterministic error. If the sentinel value is already set when the user attempts to set it again, the serf process exits.

An alternative solution is to mprotect() the entire NockStack on SIGINT. The next access will hit SIGSEGV, from where we can un-protect the NockStack memory and bail with a non-deterministic error. A second call to SIGINT while the region is already mprotect()ed will kill the serf process.

ashelkovnykov avatar Dec 01 '23 15:12 ashelkovnykov

@ashelkovnykov how hard would this be to implement on top of what you've done for bail:meme?

eamsden avatar Dec 16 '23 01:12 eamsden

This would remove the need to check the TERMINATOR static flag on every 2 and 9. Instead, if an error was returned from the hw_exception::catch block in the interpreter, we could just return bail:alrm.

eamsden avatar Dec 16 '23 15:12 eamsden

This should be pretty easy now that we have the C signal handler code for the guard page: just need to add some more handlers in the same lib.

ashelkovnykov avatar Mar 02 '24 01:03 ashelkovnykov