Related: tdf#122204 clarify 0xFFF0 size meaning
Change-Id: I71432b1a705d54f44c63f3734281a87b155c6f10
Reviewed-on: https://gerrit.libreoffice.org/65582
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx
index 8f79471..06deedf 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -2157,11 +2157,13 @@
{
sal_uInt16 nNumElemMemVert = 0;
rIn.ReadUInt16( nNumElemVert ).ReadUInt16( nNumElemMemVert ).ReadUInt16( nElemSizeVert );
// If this value is 0xFFF0 then this record is an array of truncated 8 byte elements. Only the 4
// low-order bytes are recorded
if (nElemSizeVert == 0xFFF0)
nElemSizeVert = 4;
}
if (nElemSizeVert != 8)
nElemSizeVert = 4;
//sanity check that the stream is long enough to fulfill nNumElem * nElemSize;
bool bImport = rIn.remainingSize() / nElemSizeVert >= nNumElemVert;
bool bImport = nElemSizeVert && (rIn.remainingSize() / nElemSizeVert >= nNumElemVert);
if (bImport)
{
aCoordinates.realloc( nNumElemVert );
@@ -2390,15 +2392,16 @@
sal_uInt16 nElemSizeVert = 8;
if ( SeekToContent( DFF_Prop_connectorPoints, rIn ) )
rIn.ReadUInt16( nNumElemVert ).ReadUInt16( nNumElemMemVert ).ReadUInt16( nElemSizeVert );
bool bImport = false;
if (nNumElemVert && nElemSizeVert)
{
//sanity check that the stream is long enough to fulfill nNumElemVert * nElemSizeVert;
bImport = rIn.remainingSize() / nElemSizeVert >= nNumElemVert;
rIn.ReadUInt16( nNumElemVert ).ReadUInt16( nNumElemMemVert ).ReadUInt16( nElemSizeVert );
// If this value is 0xFFF0 then this record is an array of truncated 8 byte elements. Only the 4
// low-order bytes are recorded
if (nElemSizeVert == 0xFFF0)
nElemSizeVert = 4;
}
// sanity check that the stream is long enough to fulfill nNumElemVert * nElemSizeVert;
bool bImport = nElemSizeVert && (rIn.remainingSize() / nElemSizeVert >= nNumElemVert);
if (bImport)
{
aGluePoints.realloc( nNumElemVert );
@@ -5513,13 +5516,15 @@
if (SeekToContent(DFF_Prop_pWrapPolygonVertices, rSt))
{
pTextImpRec->pWrapPolygon.reset();
sal_uInt16 nNumElemVert(0), nNumElemMemVert(0), nElemSizeVert(0);
sal_uInt16 nNumElemVert(0), nNumElemMemVert(0), nElemSizeVert(8);
rSt.ReadUInt16( nNumElemVert ).ReadUInt16( nNumElemMemVert ).ReadUInt16( nElemSizeVert );
bool bOk = false;
if (nNumElemVert && ((nElemSizeVert == 8) || (nElemSizeVert == 4)))
{
bOk = rSt.remainingSize() / nElemSizeVert >= nNumElemVert;
}
// If this value is 0xFFF0 then this record is an array of truncated 8 byte elements. Only the 4
// low-order bytes are recorded
if (nElemSizeVert == 0xFFF0)
nElemSizeVert = 4;
// sanity check that the stream is long enough to fulfill nNumElemVert * nElemSizeVert;
bool bOk = nElemSizeVert && (rSt.remainingSize() / nElemSizeVert >= nNumElemVert);
if (bOk)
{
pTextImpRec->pWrapPolygon.reset(new tools::Polygon(nNumElemVert));