Как среда песочницы восстанавливается после сбоев? - PullRequest
4 голосов
/ 13 апреля 2019

В средах выполнения JavaScript и других JIT-скомпилированных средах, где код должен быть изолирован в песочнице, как может большая программа восстанавливаться при сбое динамически загружаемого кода?

Например, код, который SpiderMonkey генерирует для WebAssembly, содержит инструкции, которые выдают SIGILL при их выполнении (например, для проверки границ). Когда возникает такая ошибка, я предполагаю, что вызывается обработчик исключений движка JavaScript. Но такой обработчик сигналов очень ограничен в своих возможностях. Чтобы выскочить из плохого динамически сгенерированного кода, он обычно использует siglongjmp, но если я правильно понимаю примечания внизу man signal-safety, если это произойдет, то никакая другая небезопасная функция не сможет использоваться программой когда-либо снова. Такое ограничение, конечно, нецелесообразно для среды выполнения JS (например,).

Так как же среды песочницы восстанавливаются после ошибок ребенка, не теряя способностей (в частности, ограничиваясь только асинхронно-безопасными функциями)?

Одна мысль, которая у меня возникла, заключается в том, что, возможно, код с песочницей запускается в другом потоке со своим собственным обработчиком сигналов, так что основной поток не теряет никаких способностей, когда дочерний поток получает сигнал. Но я не знаю, правильно ли это; Мне трудно найти документацию о том, как сигналы и потоки взаимодействуют точно.

Как вы увидите, этот вопрос помечен , но я в принципе также заинтересован в подходе Windows.

...