C ++ песочница динамические библиотеки - PullRequest
3 голосов
/ 17 июля 2010

Мне интересно, возможно ли вообще помещать в песочницу динамически связанную библиотеку через dlopen и друзей.Целью является восстановление после ошибки в библиотеке без разрушения всего приложения, например, SEGFAULT и т. Д.

Кто-нибудь имел опыт работы в этой области?

Ответы [ 3 ]

4 голосов
/ 17 июля 2010

Вы можете fork () перед вызовом библиотеки, а затем передать результат своему материнскому процессу. Позвольте материнскому процессу дождаться данных от ребенка или сообщить об ошибке в случае сбоя.

1 голос
/ 17 июля 2010

ОК, в общем, обработка исключений сильно зависит от операционной системы. Я собираюсь сделать некоторые предположения и попытаться дать общее руководство. Пожалуйста, знайте, что это ни в коем случае не исчерпывающий ответ, но он должен послужить отправной точкой.

Я предполагаю, что:

  1. В большинстве случаев вы заинтересованы в защите от утечек памяти.

  2. Вы не заинтересованы в Windows (которая является целым другим шариком воска), так как вы упомянули dlopen (в противном случае вы сказали бы LoadLibrary)

  3. что вам известны нюансы связывания с символами C ++. Если вы не читали об этом в mini howto на dlopen c ++

Вообще говоря

Не существует общего решения описанной проблемы без привлечения специализированных операционных систем, предоставляющих изолированную программную среду для сегментов данных и кода. Существуют Trusted Systems и специализированные ядра операционных систем, которые могут это делать, но я предполагаю, что вы хотите сделать это на старый добрый * nix или windows.

Компилятор еще больше усложняет проблемы (генерирует ли ваш компилятор C ++ слабые символы по умолчанию? Как правило, это будет) Это влияет на то, как происходит обработка исключений в try-catch.

Простая обработка исключений операционной системы, которая выдает сигналы (SIGSEGV, SIGFPE и т. Д.):

В системе POSIX, поддерживающей sigaction ...

Допустим, вы хотите защитить от общих вещей, таких как неправильная адресация памяти. Захватите SIGSEG с помощью sigaction перед тем, как открыть библиотеку (для защиты от функций .init), а затем также выполните проверку сигнала перед вызовом функции в библиотеке. Подумайте об использовании SA_STACK, чтобы убедиться, что ваш обработчик перепрыгивает в стек, над которым у вас есть хороший контроль, и SA_SIGINFO, чтобы ваш обработчик получил информацию об источнике.

Хорошее начало для этого - Обработка сигналов в руководстве по GNU libc

В C ++: используйте обертки и с try-catch для отлова мягких исключений

попробуй { Foo (); } ловить() { // сделай что-нибудь }

где foo - слабый символ, указывающий на функцию в вашей dll см. Мини-инструкции c ++ dlopen для гораздо большего количества примеров и деталей о загрузке классов и т. Д.

Если у вас есть более конкретные потребности, опубликуйте их, я посмотрю, смогу ли я предоставить больше информации.

Приветствия

0 голосов
/ 17 июля 2010

Как бы вы отличали segfault от вашего приложения и рассматриваемой динамической библиотеки? Создание отдельного процесса для защиты библиотеки, как описано выше, кажется наилучшим подходом.

редактирование:

найдено этот связанный вопрос, указывающий на рекомендацию CERT , предлагающую не возвращаться из обработчика SIGSEGV, если вы хотите переносимости.

...