[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:
Rafal Harabien 2011-04-20 21:31:41 +00:00
parent be4bb69ef8
commit a861f7c282

View file

@ -83,35 +83,40 @@ GetComputerNameFromRegistry(LPWSTR RegistryKey,
KeyInfo,
KeyInfoSize,
&ReturnSize);
ZwClose(KeyHandle);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
ZwClose(KeyHandle);
*nSize = ReturnSize;
SetLastErrorByStatus(Status);
return FALSE;
goto failed;
}
if (lpBuffer && *nSize > (KeyInfo->DataLength / sizeof(WCHAR)))
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;
}
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);
return TRUE;
failed:
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
SetLastErrorByStatus(Status);
return FALSE;
}
/*