summaryrefslogtreecommitdiff
path: root/filter
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-06-13 20:23:58 +0100
committerCaolán McNamara <caolanm@redhat.com>2021-06-14 09:42:19 +0200
commitf408713503a6c03427f8736c2bb2216cd151b2a5 (patch)
tree1adc9414a162b33e50b72ded81f7038371dba2de /filter
parent6bfa94398a0ea501fce7634ab0ae9ce35c442043 (diff)
ofz#33769 Integer-overflow
Change-Id: I6b76ab866cc843f52b3c0994e9812a0f1b87270c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117098 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'filter')
-rw-r--r--filter/source/graphicfilter/icgm/class4.cxx189
1 files changed, 110 insertions, 79 deletions
diff --git a/filter/source/graphicfilter/icgm/class4.cxx b/filter/source/graphicfilter/icgm/class4.cxx
index 18eff3452451..0a498426b3bc 100644
--- a/filter/source/graphicfilter/icgm/class4.cxx
+++ b/filter/source/graphicfilter/icgm/class4.cxx
@@ -107,6 +107,11 @@ bool CGM::ImplGetEllipse( FloatPoint& rCenter, FloatPoint& rRadius, double& rAng
return true;
}
+static bool useless(double value)
+{
+ return std::isnan(value) || std::isinf(value);
+}
+
void CGM::ImplDoClass4()
{
if ( mbFirstOutPut )
@@ -377,11 +382,18 @@ void CGM::ImplDoClass4()
double fG = 2.0 * ( fA * ( aEndingPoint.Y - aIntermediatePoint.Y ) - fB * ( aEndingPoint.X - aIntermediatePoint.X ) );
- if ( fG != 0 )
+ bool bUseless = fG == 0;
+
+ FloatPoint aCenterPoint;
+ if (!bUseless)
{
- FloatPoint aCenterPoint;
aCenterPoint.X = ( fD * fE - fB * fF ) / fG;
aCenterPoint.Y = ( fA * fF - fC * fE ) / fG;
+ bUseless = useless(aCenterPoint.X) || useless(aCenterPoint.Y);
+ }
+
+ if (!bUseless)
+ {
double fStartAngle = ImplGetOrientation( aCenterPoint, aStartingPoint );
double fInterAngle = ImplGetOrientation( aCenterPoint, aIntermediatePoint );
double fEndAngle = ImplGetOrientation( aCenterPoint, aEndingPoint );
@@ -516,35 +528,39 @@ void CGM::ImplDoClass4()
ImplMapDouble( aRadius.X );
aRadius.Y = aRadius.X;
- const double fStartSqrt = sqrt(vector[0] * vector[ 0 ] + vector[1] * vector[1]);
- fStartAngle = fStartSqrt != 0.0 ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0;
- const double fEndSqrt = sqrt(vector[2] * vector[ 2 ] + vector[3] * vector[3]);
- fEndAngle = fEndSqrt != 0.0 ? (acos(vector[ 2 ] / fEndSqrt) * 57.29577951308) : 0.0;
+ bool bUseless = useless(vector[0]) || useless(vector[1]) || useless(vector[2]) || useless(vector[3]);
+ if (!bUseless)
+ {
+ const double fStartSqrt = sqrt(vector[0] * vector[ 0 ] + vector[1] * vector[1]);
+ fStartAngle = fStartSqrt != 0.0 ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0;
+ const double fEndSqrt = sqrt(vector[2] * vector[ 2 ] + vector[3] * vector[3]);
+ fEndAngle = fEndSqrt != 0.0 ? (acos(vector[ 2 ] / fEndSqrt) * 57.29577951308) : 0.0;
- if ( vector[ 1 ] > 0 )
- fStartAngle = 360 - fStartAngle;
- if ( vector[ 3 ] > 0 )
- fEndAngle = 360 - fEndAngle;
+ if ( vector[ 1 ] > 0 )
+ fStartAngle = 360 - fStartAngle;
+ if ( vector[ 3 ] > 0 )
+ fEndAngle = 360 - fEndAngle;
- if ( mbAngReverse )
- ImplSwitchStartEndAngle( fStartAngle, fEndAngle );
+ if ( mbAngReverse )
+ ImplSwitchStartEndAngle( fStartAngle, fEndAngle );
- if ( mbFigure )
- {
- tools::Rectangle aBoundingBox(aCenter.X - aRadius.X, aCenter.Y - aRadius.X);
- aBoundingBox.SaturatingSetSize(Size(2 * aRadius.X, 2 * aRadius.X));
- tools::Polygon aPolygon( aBoundingBox,
- Point( static_cast<tools::Long>(vector[ 0 ]), static_cast<tools::Long>(vector[ 1 ]) ),
- Point( static_cast<tools::Long>(vector[ 2 ]), static_cast<tools::Long>(vector[ 3 ]) ), PolyStyle::Arc );
- mpOutAct->RegPolyLine( aPolygon );
- }
- else
- {
- double fOrientation = 0;
- mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, 2, fStartAngle, fEndAngle );
+ if ( mbFigure )
+ {
+ tools::Rectangle aBoundingBox(aCenter.X - aRadius.X, aCenter.Y - aRadius.X);
+ aBoundingBox.SaturatingSetSize(Size(2 * aRadius.X, 2 * aRadius.X));
+ tools::Polygon aPolygon( aBoundingBox,
+ Point( static_cast<tools::Long>(vector[ 0 ]), static_cast<tools::Long>(vector[ 1 ]) ),
+ Point( static_cast<tools::Long>(vector[ 2 ]), static_cast<tools::Long>(vector[ 3 ]) ), PolyStyle::Arc );
+ mpOutAct->RegPolyLine( aPolygon );
+ }
+ else
+ {
+ double fOrientation = 0;
+ mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, 2, fStartAngle, fEndAngle );
+ }
}
- mnParaSize = mnElementSize;
+ mnParaSize = mnElementSize;
}
break;
@@ -568,29 +584,35 @@ void CGM::ImplDoClass4()
}
ImplMapDouble( aRadius.X );
aRadius.Y = aRadius.X;
- const double fStartSqrt = sqrt(vector[0] * vector[0] + vector[1] * vector[1]);
- double fStartAngle = fStartSqrt ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0;
- const double fEndSqrt = sqrt(vector[2] * vector[2] + vector[3] * vector[3]);
- double fEndAngle = fEndSqrt ? acos(vector[2] / fEndSqrt) * 57.29577951308 : 0.0;
- if ( vector[ 1 ] > 0 )
- fStartAngle = 360 - fStartAngle;
- if ( vector[ 3 ] > 0 )
- fEndAngle = 360 - fEndAngle;
+ sal_uInt32 nType = ImplGetUI16();
- if ( mbAngReverse )
- ImplSwitchStartEndAngle( fStartAngle, fEndAngle );
+ bool bUseless = useless(vector[0]) || useless(vector[1]) || useless(vector[2]) || useless(vector[3]);
+ if (!bUseless)
+ {
+ const double fStartSqrt = sqrt(vector[0] * vector[0] + vector[1] * vector[1]);
+ double fStartAngle = fStartSqrt ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0;
+ const double fEndSqrt = sqrt(vector[2] * vector[2] + vector[3] * vector[3]);
+ double fEndAngle = fEndSqrt ? acos(vector[2] / fEndSqrt) * 57.29577951308 : 0.0;
+ if ( vector[ 1 ] > 0 )
+ fStartAngle = 360 - fStartAngle;
+ if ( vector[ 3 ] > 0 )
+ fEndAngle = 360 - fEndAngle;
- sal_uInt32 nType = ImplGetUI16();
- if ( nType == 0 )
- nType = 0; // is PIE
- else
- nType = 1; // is CHORD
- fOrientation = 0;
+ if ( mbAngReverse )
+ ImplSwitchStartEndAngle( fStartAngle, fEndAngle );
+
+ if ( nType == 0 )
+ nType = 0; // is PIE
+ else
+ nType = 1; // is CHORD
+ fOrientation = 0;
+
+ mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
+ nType, fStartAngle, fEndAngle );
+ }
- mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
- nType, fStartAngle, fEndAngle );
mnParaSize = mnElementSize;
}
break;
@@ -622,22 +644,26 @@ void CGM::ImplDoClass4()
bool bDirection = ImplGetEllipse( aCenter, aRadius, fOrientation );
ImplGetVector( &vector[ 0 ] );
- double fStartSqrt = sqrt(vector[0] * vector[0] + vector[1] * vector[1]);
- fStartAngle = fStartSqrt ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0;
- double fEndSqrt = sqrt(vector[2] * vector[2] + vector[3] * vector[3]);
- fEndAngle = fEndSqrt ? (acos(vector[2] / fEndSqrt) * 57.29577951308) : 0.0;
-
- if ( vector[ 1 ] > 0 )
- fStartAngle = 360 - fStartAngle;
- if ( vector[ 3 ] > 0 )
- fEndAngle = 360 - fEndAngle;
-
- if ( bDirection )
- mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
- 2, fStartAngle, fEndAngle );
- else
- mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
- 2, fEndAngle, fStartAngle);
+ bool bUseless = useless(vector[0]) || useless(vector[1]) || useless(vector[2]) || useless(vector[3]);
+ if (!bUseless)
+ {
+ double fStartSqrt = sqrt(vector[0] * vector[0] + vector[1] * vector[1]);
+ fStartAngle = fStartSqrt ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0;
+ double fEndSqrt = sqrt(vector[2] * vector[2] + vector[3] * vector[3]);
+ fEndAngle = fEndSqrt ? (acos(vector[2] / fEndSqrt) * 57.29577951308) : 0.0;
+
+ if ( vector[ 1 ] > 0 )
+ fStartAngle = 360 - fStartAngle;
+ if ( vector[ 3 ] > 0 )
+ fEndAngle = 360 - fEndAngle;
+
+ if ( bDirection )
+ mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
+ 2, fStartAngle, fEndAngle );
+ else
+ mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
+ 2, fEndAngle, fStartAngle);
+ }
}
break;
@@ -652,28 +678,33 @@ void CGM::ImplDoClass4()
bool bDirection = ImplGetEllipse( aCenter, aRadius, fOrientation );
ImplGetVector( &vector[ 0 ] );
- double fStartSqrt = sqrt(vector[0] * vector[0] + vector[1] * vector[1]);
- fStartAngle = fStartSqrt ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0;
- double fEndSqrt = sqrt(vector[2] * vector[2] + vector[3] * vector[3]);
- fEndAngle = fEndSqrt ? (acos(vector[2] / fEndSqrt) * 57.29577951308) : 0.0;
+ sal_uInt32 nType = ImplGetUI16();
- if ( vector[ 1 ] > 0 )
- fStartAngle = 360 - fStartAngle;
- if ( vector[ 3 ] > 0 )
- fEndAngle = 360 - fEndAngle;
+ bool bUseless = useless(vector[0]) || useless(vector[1]) || useless(vector[2]) || useless(vector[3]);
+ if (!bUseless)
+ {
+ double fStartSqrt = sqrt(vector[0] * vector[0] + vector[1] * vector[1]);
+ fStartAngle = fStartSqrt ? (acos(vector[0] / fStartSqrt) * 57.29577951308) : 0.0;
+ double fEndSqrt = sqrt(vector[2] * vector[2] + vector[3] * vector[3]);
+ fEndAngle = fEndSqrt ? (acos(vector[2] / fEndSqrt) * 57.29577951308) : 0.0;
- sal_uInt32 nType = ImplGetUI16();
- if ( nType == 0 )
- nType = 0; // is PIE
- else
- nType = 1; // is CHORD
+ if ( vector[ 1 ] > 0 )
+ fStartAngle = 360 - fStartAngle;
+ if ( vector[ 3 ] > 0 )
+ fEndAngle = 360 - fEndAngle;
- if ( bDirection )
- mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
- nType, fStartAngle, fEndAngle );
- else
- mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
- nType, fEndAngle, fStartAngle);
+ if ( nType == 0 )
+ nType = 0; // is PIE
+ else
+ nType = 1; // is CHORD
+
+ if ( bDirection )
+ mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
+ nType, fStartAngle, fEndAngle );
+ else
+ mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
+ nType, fEndAngle, fStartAngle);
+ }
}
break;
case 0x14 : /*Circular Arc Centre Reversed*/