| Предыдущий | Следующий |
| MACH_SEND_INTERRUPTED | MACH_SEND_INVALID_REPLY |
MACH_SEND_MSG_TOO_SMALL
Нарушение контракта структуры и размера
MACH_SEND_MSG_TOO_SMALL указывает на несоответствие между буфером, переданным mach_msg, аргументом send_size и структурой сообщения, объявленной заголовком и дескрипторами. Ошибка может возникнуть до начала обработки сообщения ядром, если объявленный размер отправки меньше минимального заголовка, но также может обозначать конечный элемент, выходящий за объявленную границу сообщения при обработке дескрипторов.
Поэтому простое увеличение стекового буфера на несколько байтов не является надёжным исправлением. Размер сообщения должен охватывать заголовок, счётчик тела сложного сообщения, каждый дескриптор с его фактическим размером ABI, встроенную полезную нагрузку и требуемое естественное выравнивание. В 64-разрядных сборках особенно опасно предполагать, что все варианты дескрипторов имеют одинаковую структуру.
Что проверить
- Задавайте
msgh_sizeпо полностью сформированной сериализованной структуре, а не по вручную поддерживаемой константе. - Используйте
sizeofдля фактических типов структур и дескрипторов, скомпилированных для целевой архитектуры. - До отправки проверяйте количество и типы дескрипторов, а также смещение каждой встроенной полезной нагрузки.
- Для сгенерированных интерфейсов MIG убедитесь, что тип буфера запроса и сигнатура процедуры взяты из одного сгенерированного определения.
Ссылки
- Справочник интерфейса ядра Mach: mach_msg
- Исходный код Apple XNU: mach/message.h
- Справочное руководство GNU Mach: межпроцессное взаимодействие
Нужно найти другой код? Найти другой код состояния или ошибки.