QLineF: Don't try calculating a unit vector when length is null
It's undefined and causes a division by zero. Fixes: oss-fuzz-24561 Pick-to: 5.12 5.15 Change-Id: Idebaba4b286e3ab0ecb74825d203244958ce6aec Reviewed-by: hjk <hjk@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
e1d7df5ce9
commit
c0d0949448
@ -40,7 +40,6 @@
|
|||||||
#include "qline.h"
|
#include "qline.h"
|
||||||
#include "qdebug.h"
|
#include "qdebug.h"
|
||||||
#include "qdatastream.h"
|
#include "qdatastream.h"
|
||||||
#include "qmath.h"
|
|
||||||
#include <private/qnumeric_p.h>
|
#include <private/qnumeric_p.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
@ -40,6 +40,8 @@
|
|||||||
#ifndef QLINE_H
|
#ifndef QLINE_H
|
||||||
#define QLINE_H
|
#define QLINE_H
|
||||||
|
|
||||||
|
#include "qmath.h"
|
||||||
|
|
||||||
#include <QtCore/qpoint.h>
|
#include <QtCore/qpoint.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
@ -369,12 +371,15 @@ constexpr inline QPointF QLineF::center() const
|
|||||||
return QPointF(0.5 * pt1.x() + 0.5 * pt2.x(), 0.5 * pt1.y() + 0.5 * pt2.y());
|
return QPointF(0.5 * pt1.x() + 0.5 * pt2.x(), 0.5 * pt1.y() + 0.5 * pt2.y());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QT_WARNING_DISABLE_FLOAT_COMPARE
|
||||||
|
|
||||||
inline void QLineF::setLength(qreal len)
|
inline void QLineF::setLength(qreal len)
|
||||||
{
|
{
|
||||||
if (isNull())
|
const qreal oldlength = qSqrt(dx() * dx() + dy() * dy());
|
||||||
|
if (!oldlength)
|
||||||
return;
|
return;
|
||||||
QLineF v = unitVector();
|
const qreal factor = len / oldlength;
|
||||||
pt2 = QPointF(pt1.x() + v.dx() * len, pt1.y() + v.dy() * len);
|
pt2 = QPointF(pt1.x() + dx() * factor, pt1.y() + dy() * factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr inline QPointF QLineF::pointAt(qreal t) const
|
constexpr inline QPointF QLineF::pointAt(qreal t) const
|
||||||
|
@ -40,6 +40,8 @@ private slots:
|
|||||||
void testLength();
|
void testLength();
|
||||||
void testLength_data();
|
void testLength_data();
|
||||||
|
|
||||||
|
void testSetLength();
|
||||||
|
|
||||||
void testCenter();
|
void testCenter();
|
||||||
void testCenter_data();
|
void testCenter_data();
|
||||||
|
|
||||||
@ -258,6 +260,15 @@ void tst_QLine::testLength()
|
|||||||
QCOMPARE(l.dy(), qreal(vy));
|
QCOMPARE(l.dy(), qreal(vy));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QLine::testSetLength()
|
||||||
|
{
|
||||||
|
QLineF l(0, 0, 4e-323, 5e-324);
|
||||||
|
const qreal newLength = 1892;
|
||||||
|
const qreal oldLength = l.length();
|
||||||
|
l.setLength(newLength);
|
||||||
|
QCOMPARE(l.length(), oldLength ? newLength : 0);
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QLine::testCenter()
|
void tst_QLine::testCenter()
|
||||||
{
|
{
|
||||||
QFETCH(int, x1);
|
QFETCH(int, x1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user