Почему Map_Growsown вызывает ошибки SigBus после обновления до CentOS 5.5?

StackOverflow https://stackoverflow.com/questions/4055669

Вопрос

Я модернизировал ОС на одной из нашей сборки от CentOS 5.3 32-бита до CentOS 5,5 32-битна. После выполнения обновления пакета я перезагрузился, проверил чистую копию источника, построенного и управлял устройствами устройства. Все модульные тесты, которые полагаются на наш базовый класс Memmap, начали провалиться.

Сбой происходит, когда мы пытаемся установить значение страницы охраны после немедленного отображения памяти. После того, как явился, я смог изолировать проблему нашему использованию флага Map_growsishdown, тесты работают нормально без него, но сбой, когда флаг установлен. Эти тесты работали нормально, когда система сборки работает 5.3, но немедленно начала сбой, когда мы обновились до 5,5. Они также работают нормально на моей машине развития, которая также работает 5,5, но является реальным оборудованием; Система сборки - это В.М. Xen. Это стабильный бит кода, который не был изменен несколькими релизами и обладает единичным испытательным покрытием к северу от 80%.

Так что я думаю, мой вопрос, почему это происходит?

int flags = MAP_ANONYMOUS|MAP_PRIVATE|MAP_GROWSDOWN;
int prot = PROT_EXEC|PROT_READ|PROT_WRITE;
size_t length = 524288;

long rv = ::sysconf(_SC_PAGESIZE);
if (rv < 0)
    throw SystemException(errno);
size_t pagelength = size_t(rv);

//  Adjust length for guard page
length = pagelength * (((length + pagelength - 1) / pagelength) + 1);

m_addr = ::mmap(NULL, length, prot, flags, -1, 0);
if (m_addr == MAP_FAILED)
    throw SystemException(errno);

m_stackaddr = static_cast<void *>(static_cast<char *>(m_addr) + pagelength);
m_length = length - pagelength;

// Fill the guard page with an interesting pattern
unsigned int *g = static_cast<unsigned int *>(m_addr);
for (size_t i=0; i < pagelength; i += sizeof(unsigned int))
    *g++ = 0xBADC0FFEU;  <-- SIGBUS HAPPENS HERE ON FIRST ITERATION
Это было полезно?

Решение

Похоже, что map_growsdown был удален из glibc http://bugs.centos.org/view.php?id=4767. и не следует использовать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top