mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 01:35:43 +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,
|
GetComputerNameFromRegistry(LPWSTR RegistryKey,
|
||||||
LPWSTR ValueNameStr,
|
LPWSTR ValueNameStr,
|
||||||
LPWSTR lpBuffer,
|
LPWSTR lpBuffer,
|
||||||
LPDWORD nSize )
|
LPDWORD nSize)
|
||||||
{
|
{
|
||||||
PKEY_VALUE_PARTIAL_INFORMATION KeyInfo;
|
PKEY_VALUE_PARTIAL_INFORMATION KeyInfo;
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
|
@ -50,7 +50,7 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey,
|
||||||
ULONG ReturnSize;
|
ULONG ReturnSize;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
RtlInitUnicodeString(&KeyName,RegistryKey);
|
RtlInitUnicodeString(&KeyName, RegistryKey);
|
||||||
InitializeObjectAttributes(&ObjectAttributes,
|
InitializeObjectAttributes(&ObjectAttributes,
|
||||||
&KeyName,
|
&KeyName,
|
||||||
OBJ_CASE_INSENSITIVE,
|
OBJ_CASE_INSENSITIVE,
|
||||||
|
@ -75,7 +75,7 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
RtlInitUnicodeString(&ValueName,ValueNameStr);
|
RtlInitUnicodeString(&ValueName, ValueNameStr);
|
||||||
|
|
||||||
Status = ZwQueryValueKey(KeyHandle,
|
Status = ZwQueryValueKey(KeyHandle,
|
||||||
&ValueName,
|
&ValueName,
|
||||||
|
@ -83,35 +83,40 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey,
|
||||||
KeyInfo,
|
KeyInfo,
|
||||||
KeyInfoSize,
|
KeyInfoSize,
|
||||||
&ReturnSize);
|
&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);
|
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;
|
return TRUE;
|
||||||
|
|
||||||
|
failed:
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
|
||||||
|
SetLastErrorByStatus(Status);
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue