为什么升级后确实MAP_GROWSDOWN原因SIGBUS错误转到CentOS 5.5?
-
27-09-2019 - |
题
我被升级OS上我们的构建中的一个从Centos的5.3 32位至CentOS 5.5 32位。做我重新启动包更新后,检查出源的全新副本,建造和运行单元测试。这依赖于我们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
解决方案
它看起来像MAP_GROWSDOWN已从glibc的 http://bugs.centos.org除去/view.php?id=4767 和不应当被使用。
不隶属于 StackOverflow