1

在我们的产品中,我们使用malloc完全依赖 mmap 进行内存分配的实现。我们也公平地使用allocaing。我们刚刚遇到了一个问题,mmap 将分配应该保留给堆栈空间的区域(因此,当我们的一个较大的 alloca 溢出到 malloc 的区域中时,会导致非常糟糕的事情发生)。

我们进程分配的限制是我们的VM地址空间,而不是物理内存。我们在进程运行时观察了 /proc/*/maps 文件,并观察了 malloc 占用了所有可用的地址空间。它最终诉诸于在堆栈 rlimit-set 范围内分配地址,并最终alloca延伸到其中。

我们试图通过alloca在启动时设置我们的整个堆栈限制来解决它,但这并没有证明跨平台稳定(它尝试访问alloca我的 2.4 开发盒上的 d 内存时出现段错误,而它在 2.6 生产机器上工作) .

有没有办法实际保留地址空间?还有什么可以做的?

4

2 回答 2

0

旧版本的心跳通过调用一个递归函数来确保堆栈空间被提交,该函数一次将 1Kb 的内存设置为 0xff。Heartbeat 这样做是为了能够 mlock() 它可能需要的所有内存。

于 2010-07-28T17:03:19.153 回答
0

这显然是最近记录的一个用于权限提升漏洞的安全漏洞。据称更新的内核版本将被修补。

http://www.exploit-db.com/download_pdf/14696/

于 2010-09-07T23:10:43.267 回答