我不明白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无法完成或p-> bk_nextsize-> fd_nextsize时,请观察到错误双连接列表。
但我的主要问题是我无法解释代码的这一部分 - p-> fd_nextsize-> bk_nextsize-期望是P。
也许我与垃圾箱中双链接列表的结构相混淆。
此刻,我理解了双重链接列表:
+------------------->+----------------+ <---------+
| | fd_nextsize | |
| | | |
| | | |
| +----------------+ |
| | | |
| |fd_nextsize | |
| | | |
| +----------------+ |
| | | |
| +bk_nextisize |--------------------+
| | | | |
| +----------------+ | |
| | |
| | |
| | |
| | |
| +---------------+ | |
| | P | | |
| | | | |
| +---------------+ | |
| | | | |
| |fd_nextsize +-----------+ |
| | | |
| +---------------+ |
| | | |
| +-----------+bk_nextsize | |
| | | | |
| | +---------------+ |
| | |
| | |
| | |
| +----------->+----------------+<-----------------+
| | bk_nextisize |
| | |
| | |
| +----------------+
| | |
+----------------------+ fd_nextsize |
| |
+----------------+
|bk_nextsize |
| |
+----------------+
因此,如果我对垃圾箱中的双链接列表的理解不正确(根据代码,重要信息,以及由于我们使用fd_nextsize和bk_nextsize的事实,请不要在Smplearbin中(纠正我。由于此刻,这种情况对我来说没有任何意义。
用正确图的损坏的双列表的示例。
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 |
+------------------------+