Heap analysis/glibc 2.26

(glibc 2.26) tcache_init

lok2h4rd 2022. 5. 1. 15:47

전체 코드는 아래와 같다

더보기
static void
tcache_init(void)
{
  mstate ar_ptr;
  void *victim = 0;
  const size_t bytes = sizeof (tcache_perthread_struct);

  if (tcache_shutting_down)
    return;

  arena_get (ar_ptr, bytes);
  victim = _int_malloc (ar_ptr, bytes);
  if (!victim && ar_ptr != NULL)
    {
      ar_ptr = arena_get_retry (ar_ptr, bytes);
      victim = _int_malloc (ar_ptr, bytes);
    }


  if (ar_ptr != NULL)
    __libc_lock_unlock (ar_ptr->mutex);

  /* In a low memory situation, we may not be able to allocate memory
     - in which case, we just keep trying later.  However, we
     typically do this very early, so either there is sufficient
     memory, or there isn't enough memory to do non-trivial
     allocations anyway.  */
  if (victim)
    {
      tcache = (tcache_perthread_struct *) victim;
      memset (tcache, 0, sizeof (tcache_perthread_struct));
    }

}

 

개지랄을하는 코드이다 

 

1. 변수 선언


  mstate ar_ptr;
  void *victim = 0;
  const size_t bytes = sizeof (tcache_perthread_struct);
  • ar_ptr : 아레나 주소 저장
  • victim : tcache_perthread_struct가 할당된 힙 주소 저장
  • bytes : tcache_perthread_struct의 size 값 저장

 

2. 검사 및 할당


  if (tcache_shutting_down)
    return;

  arena_get (ar_ptr, bytes);
  victim = _int_malloc (ar_ptr, bytes);
  if (!victim && ar_ptr != NULL)
    {
      ar_ptr = arena_get_retry (ar_ptr, bytes);
      victim = _int_malloc (ar_ptr, bytes);
    }


  if (ar_ptr != NULL)
    __libc_lock_unlock (ar_ptr->mutex);

malloc에서 청크를 할당 받기 위한 과정을 동일하게 수행한다 (여기서는 tcache_perthread_struct를 할당)

또한 malloc과 동일하게 실패하면 한번 더 시도한 뒤 mutex를 unlock한다

 

 

 

3. tcache에 할당 받은 주소 저장


  /* In a low memory situation, we may not be able to allocate memory
     - in which case, we just keep trying later.  However, we
     typically do this very early, so either there is sufficient
     memory, or there isn't enough memory to do non-trivial
     allocations anyway.  */
  if (victim)
    {
      tcache = (tcache_perthread_struct *) victim;
      memset (tcache, 0, sizeof (tcache_perthread_struct));
    }

tcache에 할당 받은 tcache_perthread_struct 크기의 주소(청크)를 저장한다