(https://github.com/iromise/glibc/blob/master/malloc/malloc.c#L448)
(https://github.com/iromise/glibc/blob/master/malloc/malloc.c#L465)
bk_pointer
với ptr là chunk trước đó trong tcache còn pos là chunk được free
(ptr >> 12)^addr
ptr là chunk mà ta sẽ overwrite
fw_pointer
addr là địa chỉ cần malloc tới
tcache_entry
linking cái free chunk structures*next
sẽ trỏ tới chunk tiếp theo cùng sizefree(b) sẽ trỏ b trước (*next của b sẽ trỏ NULL)
tiếp tục free(a) sẽ trỏ a, *next của a sẽ trỏ b
tương tự cho những cái sau
tcache_entry
còn ghép dữ liệu user data portion của free chunktcache_prethread_struct
counts[tc_idx]
ghi lại số freed chunks trong chuỗitcache_entry
chain, với tối đa 7 chunks trên mỗi chain
entries[tc_idx]
linking các freed chunks cùng size trong dslk đơn (tựa fastbins)
khi malloc 0x10
khi free
nhận thấy là:
highlight vàng –-> counts
highlight lam –-> entries (là 1 pointer) –-> trỏ đến chunk highlight lục
malloc 0x30 và free nó
lúc này counts nó đếm lượt free cho 0x10 và 0x30 mỗi bin là '1'
tương tự như thế cho các freed chunk cùng size (1++) hoặc khác size
struct dựa trên 2 thành phần : counts và entries
ví dụ ở hightlight vàng:
0x0000 : size 0x50
–––-0001 : size 0x40
––––––0000 : size 0x30
––––––––-0001 : size 0x20
max counts là 64(8*8)
số '0x291'(0x280 + 0x10)
là size of allocated chunk