Что означает код возврата ядра macOS 0x10000008 (MACH_SEND_MSG_TOO_SMALL)?

 
Предыдущий Следующий
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 убедитесь, что тип буфера запроса и сигнатура процедуры взяты из одного сгенерированного определения.

Ссылки


Нужно найти другой код? Найти другой код состояния или ошибки.