Объяснение MProtect Errno 12 (ENOMEM) - PullRequest
2 голосов
/ 22 марта 2011

Я пишу приложение для iPhone, используя Monotouch, и недавно приложение начало падать, заявляя

Mprotect failed at 0x863a000 (length 8192) with errno 12

с последующей довольно длинной трассировкой стека и Springboard, сообщающим, что «приложение аварийно завершилось с сигналом 6».

Я прочитал этот вопрос , в котором говорится, что приложение исчерпало всю доступную память на iPhone. Мы применили несколько общих шаблонов Dispose к приложению и, как правило, избавлялись от тяжелых предметов, как только могли. Это означало, что приложение теперь работает с меньшим объемом памяти. Однако мы все еще получаем сообщение об ошибке MProtect.

Также любопытно отметить, что при запуске приложения под инструментами инструменты сообщают, что устройству доступно достаточно свободной памяти (~ 40 МБ).

Мне было интересно, сможет ли кто-нибудь объяснить MProtect и эту ошибку, так как я не думаю, что понял ее правильно.

Ответы [ 2 ]

1 голос
/ 24 марта 2011

Использует ли ваше приложение Generics?

Остерегайтесь использования виртуальных методов для типов с Generics, для Monotouch, который должен делать много хаков во время предварительного джиттинга и еще больше магии с батутами, это может вызвать угон некоторых методов или повреждение памяти, по моему опыту, YMMV .

Сделать все методы не виртуальными в классах Generic для безопасности.

1 голос
/ 22 марта 2011

mprotect(2) просит ядро ​​операционной системы изменить режим защиты для некоторой части адресного пространства.

mprotect(2) часто используется, чтобы разделы данных адресного пространства не-исполняемый, так что переполнения буфера , уязвимости форматной строки , использование после свободного или освобождения нераспределенной памяти ошибки или аналогичные атаки не может вернуться к предоставленным злоумышленником данным.Кроме того, mprotect(2) используется, чтобы гарантировать, что пространство text программы не может быть изменено этими же уязвимостями.(Если злоумышленник может просто перезаписать предоставленные вами функции, это бесполезно.)

Но mprotect(2) не волшебство;он не может предотвратить возврат к атакам libc или неправильное использование system(3) или других интерпретаторов кода и т. д.

Что означает символ C для значения errno 12 вiPhone?Где и почему Monotouch использует mprotect(2) сам?Есть ли вероятность, что ваше программное обеспечение использует mprotect(2)?

...