Frage

Ich war ein Upgrade des Betriebssystems auf einem unserer Build von Centos 5.3 32bit auf Centos 5.5 32bit. das Paket Update Nachdem ich mich neu gestartet, überprüfte eine saubere Kopie der Quelle aus, gebaut und die Unit-Tests lief. Alle Unit-Tests, die auf unserer MemMap Basisklasse verlassen begann auszufallen.

Der Absturz tritt auf, wenn wir den Wert der Schutzseite nach sofort nach Abbilden des Speichers zu setzen versuchen. Nach stochern konnte ich das Problem zu unserer Nutzung des MAP_GROWSDOWN Flagge isolieren, führen die Tests ohne es in Ordnung, aber abstürzen, wenn das Flag gesetzt ist. Diese Tests funktionierte gut, wenn das Build-System 5.3 ausgeführt wurde, aber sofort begann abstürzt, wenn wir auf 5.5 aktualisiert. Sie arbeiten auch auf meiner Entwicklungsmaschine, die auch 5.5 laufen aber sind echte Hardware; das Erstellungssystem ein XEN VM. Dies ist ein stabiles Stück Code, die in mehreren Versionen nicht geändert hat und Einheit Testabdeckung nördlich von 80%.

Also ich denke, meine Frage ist, warum ist das passiert?

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
War es hilfreich?

Lösung

Es sieht aus wie MAP_GROWSDOWN wurde von glibc http://bugs.centos.org entfernt /view.php?id=4767 und sollten nicht verwendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top