Skip to content

infinite recursion problem #91

@nangua928

Description

@nangua928
#include <windows.h>
#include <thread>
#include <chrono>
#include <memory>

int main(int argc, wchar_t *argv[]) {
  for (int i = 0; i < 0x40; ++i)
    TlsAlloc();

  HMODULE h_vld = LoadLibraryA("vld.dll");
  typedef void(*vld_enable_t)(void);
  auto vld_enable = (vld_enable_t)::GetProcAddress(h_vld, "VLDGlobalEnable");
  vld_enable();
  std::thread([]() {std::make_shared<int>(); }).join();
  return 0;
}

当内存分配发生时,VLD将信息存储在其TLS插槽中,以避免争用并降低性能影响。当VLD被分配了一个TLS插槽= 0x40,并且内存分配发生在一个没有扩展TLS的线程中时,从VLD访问TLS插槽将触发另一个TLS扩展。
但是,扩展会调用RtlAllocateHeap来分配内存,而这次内存分配的记录会被VLD保存到TLS槽中,这会再次触发另一次TLS扩展......这样,程序就会进入无限递归。
由于某些限制,我只能在我的程序中使用dll中的vld,这使我无法在程序开始时的入口点初始化vld。我该怎么办?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions