小编use*_*089的帖子

x64 memset核心,是否通过缓冲区地址截断?

1.问题背景

最近在我们的一个在线搜索服务器上发生了核心转储.memset()由于尝试写入无效地址,核心发生,因此接收到SIGSEGV信号.以下信息来自dmsg:

is_searcher_ser[17405]: segfault at 000000002c32a668 rip 0000003da0a7b006 rsp 0000000053abc790 error 6

我们的在线服务器的环境如下:

  • 操作系统:RHEL 5.3
  • 内核:2.6.18-131.el5.custom,x86_64(64位)
  • GCC:4.1.2 20080704(Red Hat 4.1.2-44)
  • Glibc:glibc-2.5-49.6

以下是相关的代码段:

CHashMap<…>::CHashMap(…)
{
     …
     typedef HashEntry *HashEntryPtr;              
     m_ppEntry = new HashEntryPtr[m_nHashSize];   // m_nHashSize is 389 when core
     assert(m_ppEntry != NULL);
     memset(m_ppEntry, 0x0, m_nHashSize*sizeof(HashEntryPtr)); // Core in this memset() invocation 
     …
}
Run Code Online (Sandbox Code Playgroud)

上面代码的汇编代码是:

…
0x000000000091fe9e <+110>:   callq  0x502638 <_Znam@plt>  // new HashEntryPtr[m_nHashSize]
0x000000000091fea3 <+115>:   mov    0xc(%rbx),%edx         // Get the value of m_nHashSize
0x000000000091fea6 <+118>:   mov    %rax,%rdi               // Put …
Run Code Online (Sandbox Code Playgroud)

linux debugging assembly gcc gdb

27
推荐指数
1
解决办法
1419
查看次数

标签 统计

assembly ×1

debugging ×1

gcc ×1

gdb ×1

linux ×1