| Предыдущий | Следующий |
| MACH_RCV_HEADER_ERROR | MACH_RCV_INVALID_TYPE |
MACH_RCV_BODY_ERROR
Частичный приём сложного сообщения
MACH_RCV_BODY_ERROR означает, что заголовок принят, но один или несколько элементов тела не удалось доставить из-за отсутствия у получателя или ядра необходимого ресурса IPC либо виртуальной памяти. Это относится к дескрипторам прав портов и внестрочной памяти. Mach пытается обработать тело и обозначает класс ресурса дополнительными битами статуса, однако получатель не должен считать, что каждый дескриптор сохранился без изменений.
Для сложного запроса это не только признак нехватки ресурсов, но и проблема целостности протокола. Сервер, продолжающий работу при отсутствии переданных прав или с обнулённой внестрочной областью, может действовать с неполными полномочиями или неполными данными. Обычно правильная политика состоит в проверке всех обязательных дескрипторов, отклонении или отсрочке неполной работы и явном определении семантики повторной попытки для отправителя.
Что зафиксировать
- Запишите базовый результат, все биты нехватки ресурсов, идентификатор сообщения, количество дескрипторов и сведения о том, какие дескрипторы отсутствуют или непригодны.
- Проверяйте каждое принятое право и каждую внестрочную область до вызова обработчика сообщения.
- Установите ограничения приложения на число дескрипторов и объём внестрочных данных, чтобы защитить получателя под нагрузкой.
- Спроектируйте ответ или повтор так, чтобы клиенты могли отличить неполный приём от обычной ошибки проверки на стороне сервера.
Ссылки
- Справочник интерфейса ядра Mach: mach_msg
- Исходный код Apple XNU: mach/message.h
- Справочное руководство GNU Mach: межпроцессное взаимодействие
Нужно найти другой код? Найти другой код состояния или ошибки.