Resolves: ofz#488 check remaining size while parsing

Change-Id: Ibb2b6c59a159f9fafa6a065be438b59a6d2d3f21
This commit is contained in:
Caolán McNamara 2017-01-29 20:54:56 +00:00
parent 01112d2a63
commit e897f9d74d

View File

@ -466,7 +466,6 @@ void MakePreview(sal_uInt8* pBuf, sal_uInt32 nBytesRead,
pVDev->SetFillColor();
aFont.SetColor( COL_LIGHTRED );
// aFont.SetSize( Size( 0, 32 ) );
pVDev->Push( PushFlags::FONT );
pVDev->SetFont( aFont );
@ -477,12 +476,19 @@ void MakePreview(sal_uInt8* pBuf, sal_uInt32 nBytesRead,
OUString aString;
int nLen;
sal_uInt8* pDest = ImplSearchEntry( pBuf, reinterpret_cast<sal_uInt8 const *>("%%Title:"), nBytesRead - 32, 8 );
if ( pDest )
sal_uInt32 nRemainingBytes = pDest ? (nBytesRead - (pDest - pBuf)) : 0;
if (nRemainingBytes >= 8)
{
pDest += 8;
if ( *pDest == ' ' )
pDest++;
nLen = ImplGetLen( pDest, 32 );
nRemainingBytes -= 8;
if (nRemainingBytes && *pDest == ' ')
{
++pDest;
--nRemainingBytes;
}
nLen = ImplGetLen(pDest, std::min<sal_uInt32>(nRemainingBytes, 32));
if (static_cast<sal_uInt32>(nLen) < nRemainingBytes)
{
sal_uInt8 aOldValue(pDest[ nLen ]); pDest[ nLen ] = 0;
if ( strcmp( reinterpret_cast<char*>(pDest), "none" ) != 0 )
{
@ -491,40 +497,60 @@ void MakePreview(sal_uInt8* pBuf, sal_uInt32 nBytesRead,
}
pDest[ nLen ] = aOldValue;
}
}
pDest = ImplSearchEntry( pBuf, reinterpret_cast<sal_uInt8 const *>("%%Creator:"), nBytesRead - 32, 10 );
if ( pDest )
nRemainingBytes = pDest ? (nBytesRead - (pDest - pBuf)) : 0;
if (nRemainingBytes >= 10)
{
pDest += 10;
if ( *pDest == ' ' )
pDest++;
nLen = ImplGetLen( pDest, 32 );
nRemainingBytes -= 10;
if (nRemainingBytes && *pDest == ' ')
{
++pDest;
--nRemainingBytes;
}
nLen = ImplGetLen(pDest, std::min<sal_uInt32>(nRemainingBytes, 32));
if (static_cast<sal_uInt32>(nLen) < nRemainingBytes)
{
sal_uInt8 aOldValue(pDest[nLen]); pDest[nLen] = 0;
const char* pStr = reinterpret_cast<char*>(pDest);
aString += " Creator:" + OUString(pStr, strlen(pStr), RTL_TEXTENCODING_ASCII_US) + "\n";
pDest[nLen] = aOldValue;
}
}
pDest = ImplSearchEntry( pBuf, reinterpret_cast<sal_uInt8 const *>("%%CreationDate:"), nBytesRead - 32, 15 );
if ( pDest )
nRemainingBytes = pDest ? (nBytesRead - (pDest - pBuf)) : 0;
if (nRemainingBytes >= 15)
{
pDest += 15;
if ( *pDest == ' ' )
pDest++;
nLen = ImplGetLen( pDest, 32 );
nRemainingBytes -= 15;
if (nRemainingBytes && *pDest == ' ')
{
++pDest;
--nRemainingBytes;
}
nLen = ImplGetLen(pDest, std::min<sal_uInt32>(nRemainingBytes, 32));
if (static_cast<sal_uInt32>(nLen) < nRemainingBytes)
{
sal_uInt8 aOldValue(pDest[ nLen ]); pDest[ nLen ] = 0;
if ( strcmp( reinterpret_cast<char*>(pDest), "none" ) != 0 )
{
aString += " CreationDate:" + OUString::createFromAscii( reinterpret_cast<char*>(pDest) ) + "\n";
const char* pStr = reinterpret_cast<char*>(pDest);
aString += " CreationDate:" + OUString(pStr, strlen(pStr), RTL_TEXTENCODING_ASCII_US) + "\n";
}
pDest[ nLen ] = aOldValue;
}
}
pDest = ImplSearchEntry( pBuf, reinterpret_cast<sal_uInt8 const *>("%%LanguageLevel:"), nBytesRead - 4, 16 );
if ( pDest )
nRemainingBytes = pDest ? (nBytesRead - (pDest - pBuf)) : 0;
if (nRemainingBytes >= 16)
{
pDest += 16;
sal_uInt32 nCount = 4;
long nNumber = ImplGetNumber(pDest, nCount);
if ( nCount && ( (sal_uInt32)nNumber < 10 ) )
nRemainingBytes -= 16;
sal_uInt32 nCount = std::min<sal_uInt32>(nRemainingBytes, 4U);
sal_uInt32 nNumber = ImplGetNumber(pDest, nCount);
if (nCount && nNumber < 10)
{
aString += " LanguageLevel:" + OUString::number( nNumber );
}