| Предыдущий | Следующий |
| MACH_SEND_INVALID_REPLY | MACH_SEND_INVALID_NOTIFY |
MACH_SEND_INVALID_RIGHT
Ошибка владения возможностью
MACH_SEND_INVALID_RIGHT означает, что дескриптор права порта в теле сообщения запросил перемещение, копирование или создание, которое вызывающая задача не вправе выполнить. Например, для перемещения права приёма необходимо владеть этим правом; для копирования или перемещения права отправки необходимо владеть правом отправки; а для создания права отправки требуется доступ к праву приёма. Одного имени порта недостаточно для разрешения.
В отличие от заголовка, дескрипторы тела не имеют такой же гарантии атомарности «всё или ничего». Документация предупреждает, что элементы тела могут обрабатываться в разном порядке, а ядро способно уничтожить часть или всё некорректное сообщение. Путь восстановления должен считать объект сообщения потреблённым или изменённым до его повторной сборки из авторитетного состояния приложения.
Что проверить
- Исследуйте имя порта, тип дескриптора, диспозицию и предполагаемую передачу владения для каждого дескриптора.
- Отслеживайте, кто освобождает или перемещает каждое право; успешная предыдущая отправка может законно удалить право у отправителя.
- Не используйте закэшированные необработанные имена вместо явного учёта владения.
- Для сложных RPC пересоздавайте дескрипторы из устойчивых ссылок до повторной попытки.
Ссылки
- Справочник интерфейса ядра Mach: mach_msg
- Исходный код Apple XNU: mach/message.h
- Справочное руководство GNU Mach: межпроцессное взаимодействие
Нужно найти другой код? Найти другой код состояния или ошибки.