我不明白gettint错误的条件-损坏的双向链表(不小的)-
程序中有一点由于双重列表损坏(不小)而导致崩溃。
此刻,我不想知道它为什么崩溃,但是我想知道这种情况如何起作用
if (__builtin_expect (P->fd_nextsize->bk_nextsize != P, 0) || __builtin_expect(P->bk_nextsize->fd_nextsize != P, 0))
malloc_printerr (check_action,"corrupted double-linked list (not small)", P, AV);
在这里我们可以看到,当P-> fd_nextsize-> bk_nextsize!=未完成或P-> bk_nextsize-> fd_nextsize未完成时,就会看到错误的双向链接列表。
但是我的主要问题是我无法解释这部分代码-P-> fd_nextsize-> bk_nextsize-期望是P。我期望P-> fd_nextsize-> bk_nextsize是P-> bk_nextsize。
也许我对垃圾箱中的双向链表的结构感到困惑。
此刻,我理解了双向链接列表:
+------------------->+----------------+ <---------+
| | fd_nextsize | |
| | | |
| | | |
| +----------------+ |
| | | |
| |fd_nextsize | |
| | | |
| +----------------+ |
| | | |
| +bk_nextisize |--------------------+
| | | | |
| +----------------+ | |
| | |
| | |
| | |
| | |
| +---------------+ | |
| | P | | |
| | | | |
| +---------------+ | |
| | | | |
| |fd_nextsize +-----------+ |
| | | |
| +---------------+ |
| | | |
| +-----------+bk_nextsize | |
| | | | |
| | +---------------+ |
| | |
| | |
| | |
| +----------->+----------------+<-----------------+
| | bk_nextisize |
| | |
| | |
| +----------------+
| | |
+----------------------+ fd_nextsize |
| |
+----------------+
|bk_nextsize |
| |
+----------------+
因此,如果我对垃圾箱中的双链表的理解不正确(根据代码,重要的信息以及根据我们正在使用fd_nextsize和bk_nextsize的事实,此块不在smallbin中)纠正我。从现在开始,这种情况对我来说毫无意义。
答案 0 :(得分:0)
带有正确图表的损坏双列表示例。
gef> x/200x victim
0x2c76330: 0x00000000 0x00000000 0x000004d1 0x00000000
0x2c76340: 0x140e8fb8 0x00007f12 0x140e8fb8 0x00007f12
0x2c76350: 0x02c15e48 0x00000000 0x02c76330 0x00000000
0x2c76360: 0x00000318 0x00000000 0x00000000 0x00000000
Here
0x02c15e48 >>> fd_nextsize
0x02c76330 >>> bk_nextsize
gef> x/100x 0x02c15e48
0x2c15e48: 0x02c76348 0x00000000 0x00000000 0x00000000
0x2c15e58: 0x00000019 0x00000000 0x09080003 0x0071db5c
0x2c15e68: 0xc0b51d4f 0x00000001 0x000000fa 0x00000000
0x2c15e78: 0x00000003 0x00007706 0x00007706 0x586a0001
0xc0b51d4f >>> victim->fd_nextisize->fd_nextsize
0x000000fa >>> vicitim->fd_nextsize->bk_nextsize >>>>>>>>>>>>>>>>>>>>>>>>>>>>> This is not valid.
gef> x/100x 0x02c76330
0x2c76330: 0x00000000 0x00000000 0x000004d1 0x00000000
0x2c76340: 0x140e8fb8 0x00007f12 0x140e8fb8 0x00007f12
0x2c76350: 0x02c15e48 0x00000000 0x02c76330 0x00000000
0x2c76360: 0x00000318 0x00000000 0x00000000 0x00000000
0x02c15e48 >>> victim->bk_nextsize->fd_nextsize
0x02c76330 >>> victim->bk_nextsize->bk_nextsize >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This condition is valid.
Double Linked Lists in GLIBC
+----------------------+<------------------+
| ChunkA | |
+-----------------------+ |
|fd_nextsize | |
+----------------------+ |
| | |
+---+bk_nextsize | |
| +----------------------+ |
| |
| +------------------------+<---------+ |
| | ChunkB | | |
| +------------------------+ | |
| |fd_nextsize | | |
| | | | |
| +------------------------+ | |
+-----------+bk_nextsize | | |
| | +------------------------+ | |
| | | |
| +->+------------------------+<-----------------------------+
| | ChunkC | | | |
| +------------------------+ | | |
| |fd_nextsize +------------------+ |
| | | | |
| +------------------------+ | |
| +------+bk_nextsize | | |
| | +------------------------+ | |
| | | |
+---------->+------------------------+ | |
| | ChunkD | | |
| +------------------------+ | |
| |fd_nextsize +----------+ |
| +------------------------+ |
| | | |
| |bk_nextsize | |
| +------------------------+ |
| |
+----> +------------------------+ |
| ChunkE | |
+------------------------+ |
|fd_nextsize +------------------------------+
| |
+------------------------+
|bk_nextsize |
+------------------------+