内核 memcpy 实际上复制了比指定长度更多的字节

内核 memcpy 实际上复制了比指定长度更多的字节

我遇到了内核崩溃问题。

BUG: unable to handle page fault for address: ffff88812c410000 

堆栈信息显示

ip_frag_next-->skb_copy_bits-->memcpy_orig+52

分析显示传入的memcpy调用是620字节,但是崩溃时发现已经复制了107520字节。结果是访问异常。

什么会导致这种情况发生?

RDX:当前偏移量
RBX:memcpy的指定长度
RAX:memcpy的dest指针
RDI:目标的当前位置
    [异常RIP:memcpy_orig+52]
    RIP:ffffffff80a98ed4 RSP:ffffc90000067698 RFLAGS:00010282
    RAX:ffff88812c3f5c24 RBX:000000000000026c RCX:0000000000001cfc
    RDX:fffffffffffe5e4c RSI:ffff888002b3014a RDI:ffff88812c40ffe4
    RBP:ffff88812c3f5c24 R8:657fc3fb17a4d6f3 R9:763c3854b6c4e057
    R10:55cc9b5ed64cab61 R11:2afd84bbcdd9c7a3 R12:ffffffff814cbbc0
    R13:000000000000026c R14:0000000000001cfc R15:0000000000001f68


崩溃> dis -r memcpy_orig+52
0xffffffff80a98ea0:mov%rdi,%rax
0xffffffff80a98ea3 : cmp $0x20,%rdx
0xffffffff80a98ea7 : jb 0xffffffff80a98f27
0xffffffff80a98ea9 : cmp %dil,%sil
0xffffffff80a98eac:jl 0xffffffff80a98ee3
0xffffffff80a98eae : 子 $0x20,%rdx
0xffffffff80a98eb2:子$0x20,%rdx
0xffffffff80a98eb6:mov(%rsi),%r​​8
0xffffffff80a98eb9 : 移动 0x8(%rsi),%r9
0xffffffff80a98ebd : 移动 0x10(%rsi),%r10
0xffffffff80a98ec1 : 移动 0x18(%rsi),%r11
0xffffffff80a98ec5 : lea 0x20(%rsi),%rsi
0xffffffff80a98ec9 : 移动%r8,(%rdi)
0xffffffff80a98ecc : 移动%r9,0x8(%rdi)
0xffffffff80a98ed0 : 移动%r10,0x10(%rdi)
0xffffffff80a98ed4 : 移动%r11,0x18(%rdi)

从代码来看,memcpy 应该只复制指定的 620 字节数据。但它却复制了超过 107520 字节的数据,最终导致访问异常

相关内容