You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
4.5 KiB
190 lines
4.5 KiB
#include "pch.h"
|
|
#include "limits.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Read From Stdin
|
|
//Caller responsible for LocalFree(*ppBuffer)
|
|
//Return Value:
|
|
// Number of WCHAR read if successful
|
|
// -1 in case of Failure. Call GetLastError to get the error.
|
|
LONG ReadFromIn(OUT LPWSTR *ppBuffer)
|
|
{
|
|
LPWSTR pBuffer = NULL;
|
|
DWORD dwErr = ERROR_SUCCESS;
|
|
pBuffer = (LPWSTR)LocalAlloc(LPTR,INIT_SIZE*sizeof(WCHAR));
|
|
if(!pBuffer)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
return -1;
|
|
}
|
|
|
|
LONG Pos = 0;
|
|
LONG MaxSize = INIT_SIZE;
|
|
wint_t ch = 0;
|
|
if (g_fUnicodeInput)
|
|
{
|
|
//Security Review: ch is widechar
|
|
while(2 == fread(&ch,1,2,stdin))
|
|
{
|
|
if (0x000D == ch || 0xFEFF == ch) continue;
|
|
|
|
if(Pos == MaxSize -1 )
|
|
{
|
|
if(ERROR_SUCCESS != ResizeByTwo(&pBuffer,&MaxSize))
|
|
{
|
|
LocalFree(pBuffer);
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
return -1;
|
|
}
|
|
}
|
|
pBuffer[Pos++] = (WCHAR)ch;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while((ch = getwchar()) != WEOF)
|
|
{
|
|
if(Pos == MaxSize -1 )
|
|
{
|
|
if(ERROR_SUCCESS != ResizeByTwo(&pBuffer,&MaxSize))
|
|
{
|
|
LocalFree(pBuffer);
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
return -1;
|
|
}
|
|
}
|
|
pBuffer[Pos++] = (WCHAR)ch;
|
|
}
|
|
}
|
|
pBuffer[Pos] = L'\0';
|
|
*ppBuffer = pBuffer;
|
|
return Pos;
|
|
}
|
|
|
|
|
|
|
|
//General Utility Functions
|
|
DWORD ResizeByTwo( LPTSTR *ppBuffer,
|
|
LONG *pSize )
|
|
{
|
|
if(!ppBuffer || !pSize)
|
|
{
|
|
return ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
LPWSTR pTempBuffer = (LPWSTR)LocalAlloc(LPTR,(*pSize)*2*sizeof(WCHAR));
|
|
if(!pTempBuffer)
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
//Security Review:Correct memory is allocated
|
|
memcpy(pTempBuffer,*ppBuffer,*pSize*sizeof(WCHAR));
|
|
LocalFree(*ppBuffer);
|
|
*ppBuffer = pTempBuffer;
|
|
*pSize *=2;
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
BOOL StringCopy( LPWSTR *ppDest, LPWSTR pSrc)
|
|
{
|
|
if(!ppDest || !pSrc)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
*ppDest = NULL;
|
|
if(!pSrc)
|
|
return TRUE;
|
|
|
|
//Security Review:pSrc is null terminated.
|
|
*ppDest = (LPWSTR)LocalAlloc(LPTR, (wcslen(pSrc) + 1)*sizeof(WCHAR));
|
|
if(!*ppDest)
|
|
return FALSE;
|
|
//Security Review:Buffer is correctly allocated
|
|
wcscpy(*ppDest,pSrc);
|
|
return TRUE;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
// Function: ConvertStringToInterger
|
|
// Synopsis: Converts string to integer. Returns false if string is outside
|
|
// the range on an integer
|
|
// Arguments:pszInput: integer in string format
|
|
// :pIntOutput:takes converted integer
|
|
//// Returns:TRUE is successful.
|
|
//-----------------------------------------------------------------------------
|
|
BOOL ConvertStringToInterger(LPWSTR pszInput, int* pIntOutput)
|
|
{
|
|
if(!pIntOutput || !pszInput)
|
|
return FALSE;
|
|
|
|
//Get the Max len of integer
|
|
int iMaxInt = INT_MAX;
|
|
WCHAR szMaxIntBuffer[34];
|
|
//Security Review:34 is maximum buffer required
|
|
_itow(iMaxInt,szMaxIntBuffer,10);
|
|
//Security Review:_itow returns a null terminated string
|
|
UINT nMaxLen = wcslen(szMaxIntBuffer);
|
|
|
|
LPWSTR pszTempInput = pszInput;
|
|
if(pszInput[0] == L'-')
|
|
{
|
|
pszTempInput++;
|
|
}
|
|
|
|
//Security review:pszTempInput is null terminated
|
|
UINT nInputLen = wcslen(pszTempInput);
|
|
if(nInputLen > nMaxLen)
|
|
return FALSE;
|
|
|
|
//
|
|
//Convert input to long
|
|
//
|
|
LONG lInput = _wtol(pszTempInput);
|
|
|
|
//
|
|
//RAID: 700067 - ronmart
|
|
//If lInput zero, then make sure the value
|
|
//is really zero and not an error from _wtol
|
|
//
|
|
if(lInput == 0)
|
|
{
|
|
//
|
|
//Walk the string
|
|
//
|
|
for(UINT i = 0; i < nInputLen; i++)
|
|
{
|
|
//
|
|
// If non-numeric value encountered
|
|
//
|
|
if(pszTempInput[i] < L'0' || pszTempInput[i] > L'9')
|
|
{
|
|
//
|
|
// And the value isn't a space, then a char string has
|
|
// been passed so fail
|
|
//
|
|
if(pszTempInput[i] != L' ')
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
//Check its less that max integer
|
|
//
|
|
if(lInput > (LONG)iMaxInt)
|
|
return FALSE;
|
|
|
|
//
|
|
//Value is good
|
|
//
|
|
*pIntOutput = _wtoi(pszInput);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|