gpt4 book ai didi

C addrinfo 结构损坏。但是堆仍然有效

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:49 24 4
gpt4 key购买 nike

我尝试创建一个套接字并连接到远程主机。我使用 GetAddrInfo 从域解析远程主机。哪个工作正常。通话后,我得到一个具有正确值的工作地址信息结构。但在某些情况下,结构在调用 connect() 之前会损坏。

struct addrinfoW sa = { 0 };
ZeroMemory(&sa, sizeof(sa));
lookup_host(host, &sa);

int sock = 0;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == -1) {
return -1;
}
HeapValidate(GetProcessHeap(), HEAP_NO_SERIALIZE, NULL);
if(connect(sock, sa->ai_addr, sa->ai_addrlen) < 0) {
HeapValidate(GetProcessHeap(), HEAP_NO_SERIALIZE, NULL);
#ifdef _DEBUG
printf("Error: %d\n", GetLastError());
#endif // _DEBUG

return -2;
}

其中 lookup_host 定义为:

struct addrinfoW hints = { 0 };
struct addrinfoW *res;
int errcode;
ZeroMemory(&hints, sizeof(struct addrinfoW));
//ZeroMemory(res, sizeof(struct addrinfo));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags |= AI_CANONNAME;
errcode = GetAddrInfo(host, L"80", &hints, &res);//GetAddrInfoExW(L"google.de", L"80", NS_ALL, NULL, &hints, &res, NULL, NULL, NULL, NULL); //GetAddrInfoEX(L"google.de", L"80", &hints, &res);
win_free(mbHost);
if (errcode != 0)
{
//perror("getaddrinfo");
return -1;
}
void *ptr = 0;
while (res)
{
switch (res->ai_family)
{
case AF_INET:
ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr;
break;
case AF_INET6:
ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr;
break;
}
CopyMemory(out, res, sizeof(struct addrinfoW));
break;
res = res->ai_next;
}
FreeAddrInfo(res);

所以这在我的四核 Win10 笔记本电脑上运行良好。但是如果我添加例如一个

MessageBoxA(NULL, "After sock", "HTTP", MB_ICONWARNING|MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);

在 connect() 调用之前调用并在调试器中检查它损坏的 addrinfo 结构。例如,有时我可以看到应该是“google.com”的 ai_canonname 被“After Sock”覆盖了。但是堆在那之后仍然有效。所以我不知道从哪里开始调试这个。可能是其他缓冲区或结构在某处溢出了吗?

最佳答案

这是因为您在使用结果之前释放了与结果相关的所有内存。例如,ai_canonname 是指向从堆中分配的字符串的指针。在您退出 lookup_host 之前,包含其字节的内存被标记为可用以供重用。您的 CopyMemory 将复制指针而不是它指向的字节。

注意,您应该发布整个 lookup_host,包括函数定义。

在完成之前,您需要找到一种避免调用 FreeAddrInfo 的方法。或者做一个更深层次的 struct 副本,包括所有被指向的东西,你会发现它们很快变成了一个兔子洞。

我的做法是提供一个在 lookup_host 内部调用的回调函数

关于C addrinfo 结构损坏。但是堆仍然有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53300622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com