mirror of
https://github.com/reactos/reactos.git
synced 2025-04-29 18:48:53 +00:00
[KERNEL32]
* Properly check if buffer given to GetComputerName is too small. Fixes hostname.exe if computer name is MAX_COMPUTERNAME_LENGTH long (the default for bootcd since it's generated randomly in Setup). * Simplify it a bit svn path=/trunk/; revision=51412
This commit is contained in:
parent
be4bb69ef8
commit
a861f7c282
1 changed files with 33 additions and 28 deletions
|
@ -39,7 +39,7 @@ BOOL
|
|||
GetComputerNameFromRegistry(LPWSTR RegistryKey,
|
||||
LPWSTR ValueNameStr,
|
||||
LPWSTR lpBuffer,
|
||||
LPDWORD nSize )
|
||||
LPDWORD nSize)
|
||||
{
|
||||
PKEY_VALUE_PARTIAL_INFORMATION KeyInfo;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
|
@ -50,7 +50,7 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey,
|
|||
ULONG ReturnSize;
|
||||
NTSTATUS Status;
|
||||
|
||||
RtlInitUnicodeString(&KeyName,RegistryKey);
|
||||
RtlInitUnicodeString(&KeyName, RegistryKey);
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&KeyName,
|
||||
OBJ_CASE_INSENSITIVE,
|
||||
|
@ -75,7 +75,7 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
RtlInitUnicodeString(&ValueName,ValueNameStr);
|
||||
RtlInitUnicodeString(&ValueName, ValueNameStr);
|
||||
|
||||
Status = ZwQueryValueKey(KeyHandle,
|
||||
&ValueName,
|
||||
|
@ -83,35 +83,40 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey,
|
|||
KeyInfo,
|
||||
KeyInfoSize,
|
||||
&ReturnSize);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
|
||||
ZwClose(KeyHandle);
|
||||
*nSize = ReturnSize;
|
||||
SetLastErrorByStatus(Status);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (lpBuffer && *nSize > (KeyInfo->DataLength / sizeof(WCHAR)))
|
||||
{
|
||||
*nSize = KeyInfo->DataLength / sizeof(WCHAR) - 1;
|
||||
lpBuffer[*nSize] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
|
||||
ZwClose(KeyHandle);
|
||||
*nSize = ReturnSize;
|
||||
SetLastErrorByStatus(STATUS_BUFFER_OVERFLOW);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
RtlCopyMemory(lpBuffer, KeyInfo->Data, *nSize * sizeof(WCHAR));
|
||||
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
|
||||
ZwClose(KeyHandle);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
*nSize = ReturnSize;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (KeyInfo->Type != REG_SZ)
|
||||
{
|
||||
Status = STATUS_UNSUCCESSFUL;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (!lpBuffer || *nSize < (KeyInfo->DataLength / sizeof(WCHAR)))
|
||||
{
|
||||
*nSize = ReturnSize;
|
||||
Status = STATUS_BUFFER_OVERFLOW;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
*nSize = KeyInfo->DataLength / sizeof(WCHAR) - 1;
|
||||
RtlCopyMemory(lpBuffer, KeyInfo->Data, KeyInfo->DataLength);
|
||||
lpBuffer[*nSize] = 0;
|
||||
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
|
||||
|
||||
return TRUE;
|
||||
|
||||
failed:
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
|
||||
SetLastErrorByStatus(Status);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue