LINUX.ORG.RU

Два раза mprotect чтобы узнать атрибуты страницы стека....


0

0

Кошерно ли? Мне нужно в обработчике узнать, вызван ли данный SIGSEGV переполнением стека. Обработчик работает на альтернативном стеке. Берем из контекста ESP и EIP, узнаем по этой паре страницу, к которой случился доступ, а затем два раза mprotect на нее - узнаем атрибуты, затем выставляем staus quo.

Хорошо ли так делать?

Спасибо за помощь :)


Re: Два раза mprotect чтобы узнать атрибуты страницы стека....

не уверен, что правильно понял вопрос...
и не пойму, как вы узнаете текущие атрибуты через
mprotect().

у вас в si_code будет SEGV_MAPERR или SEGV_ACCERR,
а в si_addr - адрес, который был причиной fault.
сам ESP очень может быть не при чем, пример:

void bad()
{
        char big[128*1024*1024]; // esp хрен знает где
        big[64 * 1024*1024] = 0; // а SIGSEGV вот где
}

idle ★★★★★ ()

Re: Два раза mprotect чтобы узнать атрибуты страницы стека....

Ах, ёлки-палки. Я почему-то был железно уверен, что mprotect возвращает старые атрибуты :( А сейчас man прочёл...

С esp же можно общаться, если знать, что компилятор генерирует прологи только специального вида. Там ставится протычка в самый дальний угол фрейма. Ну ладно, тогда придется узнавать что стек кончился по его длине...

Спасибо.

jek_ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.