Исследования ядра LINUXа

       

классический спинлук


Неожиданные выходы из функции (они же преждевременные) происходят всякий раз, когда из-за какой-то ошибки функция уже не может (не хочет) продолжить работу делает немедленный return. Часть работы к этому моменту уже выполнена, а часть еще нет. Если программист допустит даже крошечную неаккуратность, структуры данных превратятся в кашу. Одна из таких ошибок содержится в функции create_elf_tables, описанной в прошлой статье.

Для поиска внеплановых выходов достаточно перейти в конец функции и проанализировать перекрестные ссылки, которые ведут наверх. Чем их больше, тем выше вероятность, что здесь окажется что-то не так. Ну а там и до дыры уже недалеко.

kernel:C010A810 loc_C010A810:                          ; CODE XREF: kernel:C010A7F1^j

kernel:C010A810            mov    eax, 0FFFFFFEAh

kernel:C010A815

kernel:C010A815 loc_C010A815:                          ; CODE XREF: kernel:C010A7CF^j

kernel:C010A815                                 ; kernel:C010A809^j

kernel:C010A815            pop    ebx

kernel:C010A816            pop    esi

kernel:C010A817            pop    edi

kernel:C010A818            pop    ebp

kernel:C010A819            pop    ecx

kernel:C010A81A            retn



Содержание раздела