Skip to content

getaddrinfo bug fix#7

Open
kyle-go wants to merge 1 commit intowbenny:masterfrom
kyle-go:master
Open

getaddrinfo bug fix#7
kyle-go wants to merge 1 commit intowbenny:masterfrom
kyle-go:master

Conversation

@kyle-go
Copy link
Copy Markdown

@kyle-go kyle-go commented Aug 19, 2020

#3 bug fix.

@DragonQuestHero
Copy link
Copy Markdown

nice job

@XanYua98
Copy link
Copy Markdown

NTSTATUS
NTAPI
KspUtilAddrInfoExToAddrInfo(
In PADDRINFOEXW AddrInfoEx,
Out PADDRINFOA* AddrInfo
)
{
NTSTATUS Status;

//
// Convert NULL input into NULL output.
//

if (AddrInfoEx == NULL)
{
*AddrInfo = NULL;
return STATUS_SUCCESS;
}

//
// Allocate memory for the output structure.
//

PADDRINFOA Result = ExAllocatePoolWithTag(NonPagedPool, sizeof(ADDRINFOA) + sizeof(SOCKADDR), MEMORY_TAG);

if (Result == NULL)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
goto Error1;
}

//
// Copy numeric values.
//

RtlZeroMemory(Result, sizeof(ADDRINFOA));
Result->ai_flags = AddrInfoEx->ai_flags;
Result->ai_family = AddrInfoEx->ai_family;
Result->ai_socktype = AddrInfoEx->ai_socktype;
Result->ai_protocol = AddrInfoEx->ai_protocol;
Result->ai_addrlen = AddrInfoEx->ai_addrlen;

//
// Copy canonical name.
//

UNICODE_STRING CanonicalNameUnicode = { 0 };
ANSI_STRING CanonicalNameAnsi = { 0 };

if (AddrInfoEx->ai_canonname)
{
RtlInitUnicodeString(&CanonicalNameUnicode, AddrInfoEx->ai_canonname);
Status = RtlUnicodeStringToAnsiString(&CanonicalNameAnsi, &CanonicalNameUnicode, TRUE);

if (!NT_SUCCESS(Status))
{
  goto Error2;
}

Result->ai_canonname = CanonicalNameAnsi.Buffer;

}

//
// Copy address.
//

PSOCKADDR ai_addr = (PSOCKADDR)((PUCHAR)Result + sizeof(ADDRINFOA));
memcpy(ai_addr, AddrInfoEx->ai_addr, sizeof(SOCKADDR));
Result->ai_addr = ai_addr;

//
// Copy the next structure (recursively).
//

PADDRINFOA NextAddrInfo;
Status = KspUtilAddrInfoExToAddrInfo(AddrInfoEx->ai_next, &NextAddrInfo);

if (!NT_SUCCESS(Status))
{
goto Error3;
}

Result->ai_next = NextAddrInfo;

//
// All done!
//

*AddrInfo = Result;

return Status;

Error3:
RtlFreeAnsiString(&CanonicalNameAnsi);

Error2:
ExFreePoolWithTag(Result, MEMORY_TAG);

Error1:
return Status;
}

//get ip fix

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants