diff --git a/.gitignore b/.gitignore index d00a2b5d..dad583c5 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.app *.user *.rej +.cache moc_*.cpp ui_*.h @@ -15,9 +16,8 @@ qrc_*.cpp rc_price_list.py CPackConfig.cmake - -configure.sh -configure.bat +CMakeUserPresets.json +compile_commands.json bin/ lib/ diff --git a/docs/CHANGES_2_4.txt b/docs/CHANGES_2_4.txt index 96ad0e00..5d753636 100644 --- a/docs/CHANGES_2_4.txt +++ b/docs/CHANGES_2_4.txt @@ -7,7 +7,7 @@ General: Bugfixes: ------------- -* +* Fix undefined behaviour (invalid int-to-enum cast) in AbstractTableElementPrivate::fillConstraints, detected by UBSAN. New features: ------------- diff --git a/src/KDReports/KDReportsAbstractTableElement.cpp b/src/KDReports/KDReportsAbstractTableElement.cpp index 3a186b4a..db6f5088 100644 --- a/src/KDReports/KDReportsAbstractTableElement.cpp +++ b/src/KDReports/KDReportsAbstractTableElement.cpp @@ -124,13 +124,15 @@ void KDReports::AbstractTableElementPrivate::fillConstraints(QTextTableFormat *t constraints.reserve(m_constraints.size()); for (const auto &c : m_constraints) { QTextLength length; // Variable by default - switch (c.unit) { - case Millimeters: - length = QTextLength(QTextLength::FixedLength, mmToPixels(c.width)); - break; - case Percent: - length = QTextLength(QTextLength::PercentageLength, c.width); - break; + if (c.unit.has_value()) { + switch (*c.unit) { + case Millimeters: + length = QTextLength(QTextLength::FixedLength, mmToPixels(c.width)); + break; + case Percent: + length = QTextLength(QTextLength::PercentageLength, c.width); + break; + } } constraints.append(length); } diff --git a/src/KDReports/KDReportsAbstractTableElement.h b/src/KDReports/KDReportsAbstractTableElement.h index 8b8bfac9..98792f0d 100644 --- a/src/KDReports/KDReportsAbstractTableElement.h +++ b/src/KDReports/KDReportsAbstractTableElement.h @@ -13,6 +13,7 @@ #include "KDReportsElement.h" #include "KDReportsUnit.h" +#include QT_BEGIN_NAMESPACE template @@ -105,16 +106,10 @@ class KDREPORTS_EXPORT AbstractTableElement : public Element */ QFont defaultFont(bool *isSet) const; - enum // separate because we don't want "Variable" in other uses of Unit - { - Variable = Unit::Percent + 1 /// < no constraint, \since 2.3 - }; - struct ColumnConstraint { ColumnConstraint() : width(0) - , unit(static_cast(Variable)) { } ColumnConstraint(qreal w, Unit u) @@ -123,7 +118,7 @@ class KDREPORTS_EXPORT AbstractTableElement : public Element { } qreal width; - Unit unit; + std::optional unit; }; /**