Почему MAP_GROWSDOWN вызывает ошибки SIGBUS после обновления до Centos 5.5? - PullRequest
0 голосов
/ 30 октября 2010

Я обновлял ОС на одной из наших сборок с Centos 5.3 32bit до Centos 5.5 32bit. После обновления пакета я перезагрузился, проверил чистую копию исходного кода, собрал и запустил модульные тесты. Все модульные тесты, которые основаны на нашем базовом классе MemMap, начали давать сбои.

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

1 Ответ

2 голосов
/ 14 апреля 2011

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

...