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

 
Предыдущий Следующий
MACH_RCV_TIMED_OUT MACH_RCV_INTERRUPTED

MACH_RCV_TOO_LARGE

Параметр меняет поведение при угрозе потери данных

MACH_RCV_TOO_LARGE означает, что следующее входящее сообщение не помещается в буфер receive_limit. При использовании MACH_RCV_LARGE сообщение остаётся в очереди, а Mach возвращает его фактический размер в буфере результата, позволяя получателю выделить подходящий буфер и безопасно принять сообщение. Без этого параметра слишком большое сообщение извлекается из очереди и уничтожается; вызывающая сторона получает только ограниченные сведения заголовка.

Это различие принципиально для надёжного IPC. Буфер фиксированного размера может работать в тестовой среде, но приводить к потере сообщений в эксплуатации, когда протокол развивается, диагностическая нагрузка увеличивается или одноранговый узел отправляет неожиданные данные. Наиболее безопасная политика — задать ограничения протокола и при этом явно обрабатывать сообщаемый ядром размер.

Проектирование надёжного получателя

  • Используйте MACH_RCV_LARGE, если протокол допускает сообщения переменного размера, и выделяйте память с учётом установленного максимума.
  • Перед выделением памяти проверяйте возвращённый размер относительно максимума приложения.
  • Не предполагайте, что слишком большое сообщение было отброшено; определяйте поведение по маске параметров.
  • Версионируйте протокол и явно отклоняйте чрезмерные полезные нагрузки, а не полагайтесь на фиксированный буфер приёма.

Ссылки


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