api: selectively use temporary variable to prepare output
Suggested-by: Jason A. Donenfeld <Jason@zx2c4.com> Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
parent
8c935ce151
commit
1b3af95be3
@ -33,14 +33,17 @@ AdapterGetDrvInfoDetail(
|
||||
DWORD Size = sizeof(SP_DRVINFO_DETAIL_DATA_W) + 0x100;
|
||||
for (;;)
|
||||
{
|
||||
*DrvInfoDetailData = HeapAlloc(ModuleHeap, 0, Size);
|
||||
if (!*DrvInfoDetailData)
|
||||
SP_DRVINFO_DETAIL_DATA_W *p = HeapAlloc(ModuleHeap, 0, Size);
|
||||
if (!p)
|
||||
return LOG(WINTUN_LOG_ERR, L"Out of memory"), ERROR_OUTOFMEMORY;
|
||||
(*DrvInfoDetailData)->cbSize = sizeof(SP_DRVINFO_DETAIL_DATA_W);
|
||||
if (SetupDiGetDriverInfoDetailW(DevInfo, DevInfoData, DrvInfoData, *DrvInfoDetailData, Size, &Size))
|
||||
p->cbSize = sizeof(SP_DRVINFO_DETAIL_DATA_W);
|
||||
if (SetupDiGetDriverInfoDetailW(DevInfo, DevInfoData, DrvInfoData, p, Size, &Size))
|
||||
{
|
||||
*DrvInfoDetailData = p;
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
DWORD Result = GetLastError();
|
||||
HeapFree(ModuleHeap, 0, *DrvInfoDetailData);
|
||||
HeapFree(ModuleHeap, 0, p);
|
||||
if (Result != ERROR_INSUFFICIENT_BUFFER)
|
||||
return LOG_ERROR(L"Failed", Result);
|
||||
}
|
||||
@ -57,13 +60,16 @@ GetDeviceRegistryProperty(
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
*Buf = HeapAlloc(ModuleHeap, 0, *BufLen);
|
||||
if (!*Buf)
|
||||
BYTE *p = HeapAlloc(ModuleHeap, 0, *BufLen);
|
||||
if (!p)
|
||||
return LOG(WINTUN_LOG_ERR, L"Out of memory"), ERROR_OUTOFMEMORY;
|
||||
if (SetupDiGetDeviceRegistryPropertyW(DevInfo, DevInfoData, Property, ValueType, *Buf, *BufLen, BufLen))
|
||||
if (SetupDiGetDeviceRegistryPropertyW(DevInfo, DevInfoData, Property, ValueType, p, *BufLen, BufLen))
|
||||
{
|
||||
*Buf = p;
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
DWORD Result = GetLastError();
|
||||
HeapFree(ModuleHeap, 0, *Buf);
|
||||
HeapFree(ModuleHeap, 0, p);
|
||||
if (Result != ERROR_INSUFFICIENT_BUFFER)
|
||||
return LOG_ERROR(L"Querying property failed", Result);
|
||||
}
|
||||
@ -506,8 +512,8 @@ CreateAdapterData(
|
||||
if (Key == INVALID_HANDLE_VALUE)
|
||||
return LOG_LAST_ERROR(L"Opening device registry key failed");
|
||||
|
||||
*Adapter = HeapAlloc(ModuleHeap, 0, sizeof(WINTUN_ADAPTER));
|
||||
if (!*Adapter)
|
||||
WINTUN_ADAPTER *a = HeapAlloc(ModuleHeap, 0, sizeof(WINTUN_ADAPTER));
|
||||
if (!a)
|
||||
{
|
||||
LOG(WINTUN_LOG_ERR, L"Out of memory");
|
||||
Result = ERROR_OUTOFMEMORY;
|
||||
@ -522,7 +528,7 @@ CreateAdapterData(
|
||||
LOG(WINTUN_LOG_ERR, L"Failed to query NetCfgInstanceId value");
|
||||
goto cleanupAdapter;
|
||||
}
|
||||
if (FAILED(CLSIDFromString(ValueStr, &(*Adapter)->CfgInstanceID)))
|
||||
if (FAILED(CLSIDFromString(ValueStr, &a->CfgInstanceID)))
|
||||
{
|
||||
LOG(WINTUN_LOG_ERR, L"NetCfgInstanceId is not a GUID");
|
||||
HeapFree(ModuleHeap, 0, ValueStr);
|
||||
@ -532,7 +538,7 @@ CreateAdapterData(
|
||||
HeapFree(ModuleHeap, 0, ValueStr);
|
||||
|
||||
/* Read the NetLuidIndex value. */
|
||||
Result = RegistryQueryDWORD(Key, L"NetLuidIndex", &(*Adapter)->LuidIndex, TRUE);
|
||||
Result = RegistryQueryDWORD(Key, L"NetLuidIndex", &a->LuidIndex, TRUE);
|
||||
if (Result != ERROR_SUCCESS)
|
||||
{
|
||||
LOG(WINTUN_LOG_ERR, L"Failed to query NetLuidIndex value");
|
||||
@ -540,7 +546,7 @@ CreateAdapterData(
|
||||
}
|
||||
|
||||
/* Read the NetLuidIndex value. */
|
||||
Result = RegistryQueryDWORD(Key, L"*IfType", &(*Adapter)->IfType, TRUE);
|
||||
Result = RegistryQueryDWORD(Key, L"*IfType", &a->IfType, TRUE);
|
||||
if (Result != ERROR_SUCCESS)
|
||||
{
|
||||
LOG(WINTUN_LOG_ERR, L"Failed to query *IfType value");
|
||||
@ -548,24 +554,24 @@ CreateAdapterData(
|
||||
}
|
||||
|
||||
DWORD Size;
|
||||
if (!SetupDiGetDeviceInstanceIdW(
|
||||
DevInfo, DevInfoData, (*Adapter)->DevInstanceID, _countof((*Adapter)->DevInstanceID), &Size))
|
||||
if (!SetupDiGetDeviceInstanceIdW(DevInfo, DevInfoData, a->DevInstanceID, _countof(a->DevInstanceID), &Size))
|
||||
{
|
||||
Result = LOG_LAST_ERROR(L"Failed to get device instance ID");
|
||||
goto cleanupAdapter;
|
||||
}
|
||||
|
||||
if (wcsncpy_s((*Adapter)->Pool, _countof((*Adapter)->Pool), Pool, _TRUNCATE) == STRUNCATE)
|
||||
if (wcsncpy_s(a->Pool, _countof(a->Pool), Pool, _TRUNCATE) == STRUNCATE)
|
||||
{
|
||||
LOG(WINTUN_LOG_ERR, L"Pool name too long");
|
||||
Result = ERROR_INVALID_PARAMETER;
|
||||
goto cleanupAdapter;
|
||||
}
|
||||
*Adapter = a;
|
||||
Result = ERROR_SUCCESS;
|
||||
|
||||
cleanupAdapter:
|
||||
if (Result != ERROR_SUCCESS)
|
||||
HeapFree(ModuleHeap, 0, *Adapter);
|
||||
HeapFree(ModuleHeap, 0, a);
|
||||
cleanupKey:
|
||||
RegCloseKey(Key);
|
||||
return Result;
|
||||
@ -884,7 +890,6 @@ cleanupQueriedStore:
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
||||
static BOOL
|
||||
IsOurDrvInfoDetail(_In_ const SP_DRVINFO_DETAIL_DATA_W *DrvInfoDetailData)
|
||||
{
|
||||
@ -1167,7 +1172,8 @@ CreateAdapter(
|
||||
goto cleanupNetDevRegKey;
|
||||
}
|
||||
|
||||
Result = CreateAdapterData(Pool, DevInfo, &DevInfoData, Adapter);
|
||||
WINTUN_ADAPTER *a;
|
||||
Result = CreateAdapterData(Pool, DevInfo, &DevInfoData, &a);
|
||||
if (Result != ERROR_SUCCESS)
|
||||
{
|
||||
LOG(WINTUN_LOG_ERR, L"Failed to create adapter data");
|
||||
@ -1176,7 +1182,7 @@ CreateAdapter(
|
||||
|
||||
HKEY TcpipAdapterRegKey;
|
||||
WCHAR TcpipAdapterRegPath[MAX_REG_PATH];
|
||||
Result = GetTcpipAdapterRegPath(*Adapter, TcpipAdapterRegPath);
|
||||
Result = GetTcpipAdapterRegPath(a, TcpipAdapterRegPath);
|
||||
if (Result != ERROR_SUCCESS)
|
||||
goto cleanupAdapter;
|
||||
Result = RegistryOpenKeyWait(
|
||||
@ -1200,7 +1206,7 @@ CreateAdapter(
|
||||
|
||||
HKEY TcpipInterfaceRegKey;
|
||||
WCHAR TcpipInterfaceRegPath[MAX_REG_PATH];
|
||||
Result = GetTcpipInterfaceRegPath(*Adapter, TcpipInterfaceRegPath);
|
||||
Result = GetTcpipInterfaceRegPath(a, TcpipInterfaceRegPath);
|
||||
if (Result != ERROR_SUCCESS)
|
||||
{
|
||||
LOG(WINTUN_LOG_ERR, L"Failed to determine interface-specific TCP/IP network registry key path");
|
||||
@ -1224,15 +1230,17 @@ CreateAdapter(
|
||||
if (Result != ERROR_SUCCESS)
|
||||
LOG_ERROR(L"Failed to set EnableDeadGWDetect", Result);
|
||||
|
||||
Result = WintunSetAdapterName(*Adapter, Name);
|
||||
if (Result != ERROR_SUCCESS)
|
||||
Result = WintunSetAdapterName(a, Name);
|
||||
if (Result == ERROR_SUCCESS)
|
||||
*Adapter = a;
|
||||
else
|
||||
LOG_ERROR(L"Failed to set adapter name", Result);
|
||||
RegCloseKey(TcpipInterfaceRegKey);
|
||||
cleanupTcpipAdapterRegKey:
|
||||
RegCloseKey(TcpipAdapterRegKey);
|
||||
cleanupAdapter:
|
||||
if (Result != ERROR_SUCCESS)
|
||||
HeapFree(ModuleHeap, 0, *Adapter);
|
||||
HeapFree(ModuleHeap, 0, a);
|
||||
cleanupNetDevRegKey:
|
||||
RegCloseKey(NetDevRegKey);
|
||||
cleanupDevice:
|
||||
|
@ -181,13 +181,16 @@ RegistryQuery(
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
*Buf = HeapAlloc(ModuleHeap, 0, *BufLen);
|
||||
if (!*Buf)
|
||||
BYTE *p = HeapAlloc(ModuleHeap, 0, *BufLen);
|
||||
if (!p)
|
||||
return LOG(WINTUN_LOG_ERR, L"Out of memory"), ERROR_OUTOFMEMORY;
|
||||
LSTATUS Result = RegQueryValueExW(Key, Name, NULL, ValueType, (BYTE *)*Buf, BufLen);
|
||||
LSTATUS Result = RegQueryValueExW(Key, Name, NULL, ValueType, p, BufLen);
|
||||
if (Result == ERROR_SUCCESS)
|
||||
{
|
||||
*Buf = p;
|
||||
return ERROR_SUCCESS;
|
||||
HeapFree(ModuleHeap, 0, *Buf);
|
||||
}
|
||||
HeapFree(ModuleHeap, 0, p);
|
||||
if (Result != ERROR_MORE_DATA)
|
||||
return Log ? LOG_ERROR(L"Querying value failed", Result) : Result;
|
||||
}
|
||||
|
@ -67,8 +67,8 @@ typedef struct _TUN_SESSION
|
||||
WINTUN_STATUS WINAPI
|
||||
WintunStartSession(_In_ const WINTUN_ADAPTER *Adapter, _In_ DWORD Capacity, _Out_ TUN_SESSION **Session)
|
||||
{
|
||||
*Session = HeapAlloc(ModuleHeap, HEAP_ZERO_MEMORY, sizeof(TUN_SESSION));
|
||||
if (!*Session)
|
||||
TUN_SESSION *s = HeapAlloc(ModuleHeap, HEAP_ZERO_MEMORY, sizeof(TUN_SESSION));
|
||||
if (!s)
|
||||
return LOG(WINTUN_LOG_ERR, L"Out of memory"), ERROR_OUTOFMEMORY;
|
||||
const ULONG RingSize = TUN_RING_SIZE(Capacity);
|
||||
DWORD Result;
|
||||
@ -84,25 +84,25 @@ WintunStartSession(_In_ const WINTUN_ADAPTER *Adapter, _In_ DWORD Capacity, _Out
|
||||
Result = ERROR_ACCESS_DENIED;
|
||||
goto cleanupAllocatedRegion;
|
||||
}
|
||||
(*Session)->Descriptor.Send.RingSize = RingSize;
|
||||
(*Session)->Descriptor.Send.Ring = (TUN_RING *)AllocatedRegion;
|
||||
(*Session)->Descriptor.Send.TailMoved = CreateEventW(&SecurityAttributes, FALSE, FALSE, NULL);
|
||||
if (!(*Session)->Descriptor.Send.TailMoved)
|
||||
s->Descriptor.Send.RingSize = RingSize;
|
||||
s->Descriptor.Send.Ring = (TUN_RING *)AllocatedRegion;
|
||||
s->Descriptor.Send.TailMoved = CreateEventW(&SecurityAttributes, FALSE, FALSE, NULL);
|
||||
if (!s->Descriptor.Send.TailMoved)
|
||||
{
|
||||
Result = LOG_LAST_ERROR(L"Failed to create send event");
|
||||
goto cleanupToken;
|
||||
}
|
||||
|
||||
(*Session)->Descriptor.Receive.RingSize = RingSize;
|
||||
(*Session)->Descriptor.Receive.Ring = (TUN_RING *)(AllocatedRegion + RingSize);
|
||||
(*Session)->Descriptor.Receive.TailMoved = CreateEvent(&SecurityAttributes, FALSE, FALSE, NULL);
|
||||
if (!(*Session)->Descriptor.Receive.TailMoved)
|
||||
s->Descriptor.Receive.RingSize = RingSize;
|
||||
s->Descriptor.Receive.Ring = (TUN_RING *)(AllocatedRegion + RingSize);
|
||||
s->Descriptor.Receive.TailMoved = CreateEventW(&SecurityAttributes, FALSE, FALSE, NULL);
|
||||
if (!s->Descriptor.Receive.TailMoved)
|
||||
{
|
||||
Result = LOG_LAST_ERROR(L"Failed to create receive event");
|
||||
goto cleanupSendTailMoved;
|
||||
}
|
||||
|
||||
Result = WintunGetAdapterDeviceObject(Adapter, &(*Session)->Handle);
|
||||
Result = WintunGetAdapterDeviceObject(Adapter, &s->Handle);
|
||||
if (Result != ERROR_SUCCESS)
|
||||
{
|
||||
LOG(WINTUN_LOG_ERR, L"Failed to open adapter device object");
|
||||
@ -110,9 +110,9 @@ WintunStartSession(_In_ const WINTUN_ADAPTER *Adapter, _In_ DWORD Capacity, _Out
|
||||
}
|
||||
DWORD BytesReturned;
|
||||
if (!DeviceIoControl(
|
||||
(*Session)->Handle,
|
||||
s->Handle,
|
||||
TUN_IOCTL_REGISTER_RINGS,
|
||||
&(*Session)->Descriptor,
|
||||
&s->Descriptor,
|
||||
sizeof(TUN_REGISTER_RINGS),
|
||||
NULL,
|
||||
0,
|
||||
@ -123,23 +123,23 @@ WintunStartSession(_In_ const WINTUN_ADAPTER *Adapter, _In_ DWORD Capacity, _Out
|
||||
goto cleanupHandle;
|
||||
}
|
||||
RevertToSelf();
|
||||
(*Session)->Capacity = Capacity;
|
||||
(void)InitializeCriticalSectionAndSpinCount(&(*Session)->Receive.Lock, LOCK_SPIN_COUNT);
|
||||
(void)InitializeCriticalSectionAndSpinCount(&(*Session)->Send.Lock, LOCK_SPIN_COUNT);
|
||||
s->Capacity = Capacity;
|
||||
(void)InitializeCriticalSectionAndSpinCount(&s->Receive.Lock, LOCK_SPIN_COUNT);
|
||||
(void)InitializeCriticalSectionAndSpinCount(&s->Send.Lock, LOCK_SPIN_COUNT);
|
||||
*Session = s;
|
||||
return ERROR_SUCCESS;
|
||||
cleanupHandle:
|
||||
CloseHandle((*Session)->Handle);
|
||||
CloseHandle(s->Handle);
|
||||
cleanupReceiveTailMoved:
|
||||
CloseHandle((*Session)->Descriptor.Receive.TailMoved);
|
||||
CloseHandle(s->Descriptor.Receive.TailMoved);
|
||||
cleanupSendTailMoved:
|
||||
CloseHandle((*Session)->Descriptor.Send.TailMoved);
|
||||
CloseHandle(s->Descriptor.Send.TailMoved);
|
||||
cleanupToken:
|
||||
RevertToSelf();
|
||||
cleanupAllocatedRegion:
|
||||
VirtualFree(AllocatedRegion, 0, MEM_RELEASE);
|
||||
cleanupRings:
|
||||
HeapFree(ModuleHeap, 0, *Session);
|
||||
*Session = NULL;
|
||||
HeapFree(ModuleHeap, 0, s);
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user