sc/source/core/tool/interpr2.cxx | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-)
New commits: commit 002697221215e009cdf20fd5c12b50350b8a2128 Author: Stephan Bergmann <sberg...@redhat.com> Date: Tue Jun 21 09:23:42 2016 +0200 Avoid undefined behavior when converting from double to short Change-Id: Idfae52f6807cec225a52d3d6c79f03fd9da965c1 diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx index c9a73d4..2eae22b 100644 --- a/sc/source/core/tool/interpr2.cxx +++ b/sc/source/core/tool/interpr2.cxx @@ -50,6 +50,7 @@ #include <com/sun/star/sheet/DataPilotFieldFilter.hpp> +#include <limits> #include <string.h> #include <math.h> @@ -191,7 +192,16 @@ void ScInterpreter::ScGetDayOfWeek() { short nFlag; if (nParamCount == 2) - nFlag = (short) ::rtl::math::approxFloor(GetDouble()); + { + double x = rtl::math::approxFloor(GetDouble()); + if (x > double(std::numeric_limits<short>::min()) - 1 + && x < double(std::numeric_limits<short>::max()) + 1) + { + nFlag = static_cast<short>(x); + } + else + nFlag = -1; // cause error in switch below + } else nFlag = 1; @@ -248,7 +258,24 @@ void ScInterpreter::ScGetWeekOfYear() sal_uInt8 nParamCount = GetByte(); if ( MustHaveParamCount( nParamCount, 1, 2 ) ) { - short nFlag = (nParamCount == 1) ? 1 : (short) ::rtl::math::approxFloor(GetDouble()); + short nFlag; + if (nParamCount == 1) + { + nFlag = 1; + } + else + { + double x = rtl::math::approxFloor(GetDouble()); + if (x > double(std::numeric_limits<short>::min()) - 1 + && x < double(std::numeric_limits<short>::max()) + 1) + { + nFlag = static_cast<short>(x); + } + else + { + nFlag = -1; // cause error in switch below + } + } Date aDate = *(pFormatter->GetNullDate()); aDate += (long)::rtl::math::approxFloor(GetDouble()); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits