Kaydet (Commit) 14873da8 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Check for short reads

Change-Id: I55b9cec694623a3736a78b11b5fdde7d0edaf199
üst d0800e35
...@@ -255,7 +255,10 @@ bool ImplReadDIBPalette( SvStream& rIStm, BitmapWriteAccess& rAcc, bool bQuad ) ...@@ -255,7 +255,10 @@ bool ImplReadDIBPalette( SvStream& rIStm, BitmapWriteAccess& rAcc, bool bQuad )
BitmapColor aPalColor; BitmapColor aPalColor;
boost::scoped_array<sal_uInt8> pEntries(new sal_uInt8[ nPalSize ]); boost::scoped_array<sal_uInt8> pEntries(new sal_uInt8[ nPalSize ]);
rIStm.Read( pEntries.get(), nPalSize ); if (rIStm.Read( pEntries.get(), nPalSize ) != nPalSize)
{
return false;
}
sal_uInt8* pTmpEntry = pEntries.get(); sal_uInt8* pTmpEntry = pEntries.get();
for( sal_uInt16 i = 0; i < nColors; i++ ) for( sal_uInt16 i = 0; i < nColors; i++ )
...@@ -410,7 +413,16 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r ...@@ -410,7 +413,16 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
// Read data // Read data
if(bNative) if(bNative)
{ {
rIStm.Read(rAcc.GetBuffer(), rHeader.nHeight * nAlignedWidth); if (nAlignedWidth
> std::numeric_limits<sal_Size>::max() / rHeader.nHeight)
{
return false;
}
sal_Size n = nAlignedWidth * rHeader.nHeight;
if (rIStm.Read(rAcc.GetBuffer(), n) != n)
{
return false;
}
} }
else else
{ {
...@@ -430,10 +442,14 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r ...@@ -430,10 +442,14 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
rHeader.nSizeImage = rIStm.remainingSize(); rHeader.nSizeImage = rIStm.remainingSize();
} }
sal_uInt8* pBuffer = (sal_uInt8*)rtl_allocateMemory(rHeader.nSizeImage); boost::scoped_ptr<sal_uInt8> pBuffer(
rIStm.Read((char*)pBuffer, rHeader.nSizeImage); new sal_uInt8[rHeader.nSizeImage]);
ImplDecodeRLE(pBuffer, rHeader, rAcc, RLE_4 == rHeader.nCompression); if (rIStm.Read((char*)pBuffer.get(), rHeader.nSizeImage)
rtl_freeMemory(pBuffer); != rHeader.nSizeImage)
{
return false;
}
ImplDecodeRLE(pBuffer.get(), rHeader, rAcc, RLE_4 == rHeader.nCompression);
} }
else else
{ {
...@@ -454,7 +470,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r ...@@ -454,7 +470,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
for( ; nCount--; nY += nI ) for( ; nCount--; nY += nI )
{ {
rIStm.Read( pTmp = pBuf.get(), nAlignedWidth ); if (rIStm.Read( pTmp = pBuf.get(), nAlignedWidth )
!= nAlignedWidth)
{
return false;
}
cTmp = *pTmp++; cTmp = *pTmp++;
for( long nX = 0L, nShift = 8L; nX < nWidth; nX++ ) for( long nX = 0L, nShift = 8L; nX < nWidth; nX++ )
...@@ -478,7 +498,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r ...@@ -478,7 +498,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
for( ; nCount--; nY += nI ) for( ; nCount--; nY += nI )
{ {
rIStm.Read( pTmp = pBuf.get(), nAlignedWidth ); if (rIStm.Read( pTmp = pBuf.get(), nAlignedWidth )
!= nAlignedWidth)
{
return false;
}
cTmp = *pTmp++; cTmp = *pTmp++;
for( long nX = 0L, nShift = 2L; nX < nWidth; nX++ ) for( long nX = 0L, nShift = 2L; nX < nWidth; nX++ )
...@@ -501,7 +525,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r ...@@ -501,7 +525,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
for( ; nCount--; nY += nI ) for( ; nCount--; nY += nI )
{ {
rIStm.Read( pTmp = pBuf.get(), nAlignedWidth ); if (rIStm.Read( pTmp = pBuf.get(), nAlignedWidth )
!= nAlignedWidth)
{
return false;
}
for( long nX = 0L; nX < nWidth; nX++ ) for( long nX = 0L; nX < nWidth; nX++ )
rAcc.SetPixelIndex( nY, nX, *pTmp++ ); rAcc.SetPixelIndex( nY, nX, *pTmp++ );
...@@ -517,7 +545,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r ...@@ -517,7 +545,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
for( ; nCount--; nY += nI ) for( ; nCount--; nY += nI )
{ {
rIStm.Read( (char*)( pTmp16 = (sal_uInt16*) pBuf.get() ), nAlignedWidth ); if (rIStm.Read( (char*)( pTmp16 = (sal_uInt16*) pBuf.get() ), nAlignedWidth )
!= nAlignedWidth)
{
return false;
}
for( long nX = 0L; nX < nWidth; nX++ ) for( long nX = 0L; nX < nWidth; nX++ )
{ {
...@@ -535,7 +567,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r ...@@ -535,7 +567,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
for( ; nCount--; nY += nI ) for( ; nCount--; nY += nI )
{ {
rIStm.Read( pTmp = pBuf.get(), nAlignedWidth ); if (rIStm.Read( pTmp = pBuf.get(), nAlignedWidth )
!= nAlignedWidth)
{
return false;
}
for( long nX = 0L; nX < nWidth; nX++ ) for( long nX = 0L; nX < nWidth; nX++ )
{ {
...@@ -560,7 +596,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r ...@@ -560,7 +596,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
for( ; nCount--; nY += nI ) for( ; nCount--; nY += nI )
{ {
rIStm.Read( (char*)( pTmp32 = (sal_uInt32*) pBuf.get() ), nAlignedWidth ); if (rIStm.Read( (char*)( pTmp32 = (sal_uInt32*) pBuf.get() ), nAlignedWidth )
!= nAlignedWidth)
{
return false;
}
for( long nX = 0L; nX < nWidth; nX++ ) for( long nX = 0L; nX < nWidth; nX++ )
{ {
...@@ -575,7 +615,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r ...@@ -575,7 +615,11 @@ bool ImplReadDIBBits(SvStream& rIStm, DIBV5Header& rHeader, BitmapWriteAccess& r
{ {
for( ; nCount--; nY += nI ) for( ; nCount--; nY += nI )
{ {
rIStm.Read( (char*)( pTmp32 = (sal_uInt32*) pBuf.get() ), nAlignedWidth ); if (rIStm.Read( (char*)( pTmp32 = (sal_uInt32*) pBuf.get() ), nAlignedWidth )
!= nAlignedWidth)
{
return false;
}
for( long nX = 0L; nX < nWidth; nX++ ) for( long nX = 0L; nX < nWidth; nX++ )
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment