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