Question

je mettez à niveau le système d'exploitation sur un de nos construction de CentOS 5.3 32bit à CentOS 5.5 32bit. Après avoir fait la mise à jour du package je redémarré, vérifié une copie propre de la source, construit et a couru les tests unitaires. Tous les tests unitaires qui comptent sur notre classe de base memmap a commencé à échouer.

Le crash se produit lorsque l'on tente de définir la valeur de la page de garde après la cartographie immédiatement après la mémoire. Après farfouillé j'ai pu isoler le problème à notre utilisation du drapeau MAP_GROWSDOWN, les tests fonctionnent très bien sans elle, mais quand le drapeau écrasent est ensemble. Ces tests ont fonctionné très bien lorsque le système de construction en cours d'exécution a été 5.3, mais a commencé immédiatement quand nous écraser mis à niveau à 5,5. Ils travaillent aussi bien sur ma machine de développement qui est en cours d'exécution aussi 5.5 mais est matériel réel; le système de construction est une machine virtuelle Xen. Ceci est un bit stable de code qui n'a pas été modifié dans plusieurs versions et a une couverture de test unitaire au nord de 80%.

Je suppose que ma question est pourquoi est-ce qui se passe?

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
Était-ce utile?

La solution

On dirait que MAP_GROWSDOWN a été retiré de la glibc http://bugs.centos.org /view.php?id=4767 et ne doit pas être utilisé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top