2.31부터 tcache 관련 함수들도 조금씩 바뀌었다.
tcache_entry
typedef struct tcache_entry
{
struct tcache_entry *next;
/* This field exists to detect double frees. */
struct tcache_perthread_struct *key;
} tcache_entry;
key 라는 포인터 변수가 생겼다.
tcache double free를 막기 위해서 2.29에서 추가되었다.
tcache_put
static __always_inline void
tcache_put (mchunkptr chunk, size_t tc_idx)
{
tcache_entry *e = (tcache_entry *) chunk2mem (chunk);
/* Mark this chunk as "in the tcache" so the test in _int_free will
detect a double free. */
e->key = tcache;
e->next = tcache->entries[tc_idx];
tcache->entries[tc_idx] = e;
++(tcache->counts[tc_idx]);
}
e->key = tcache;
가 추가되었다.
double linked list 기준으로 bk부분에 위치한다. tcache 주소를 넣음으로서 이 chunk는 tcache에 들어가있는 chunk라는 것을 의미한다.
tcache_get
static __always_inline void *
tcache_get (size_t tc_idx)
{
tcache_entry *e = tcache->entries[tc_idx];
tcache->entries[tc_idx] = e->next;
--(tcache->counts[tc_idx]);
e->key = NULL;
return (void *) e;
}
e->key = NULL;
tcache에서 나오면서 e→key를 NULL로 한다.
<틀린 부분이 있다면 비난과 욕설을 해주세요>
'포너블 > Heap' 카테고리의 다른 글
double free (0) | 2023.11.07 |
---|---|
UAF (0) | 2023.11.07 |
Tcache function (0) | 2023.09.22 |
Tcache (0) | 2023.09.12 |
free 소스코드 분석(libc 2.27) (0) | 2023.08.28 |