chart2/source/view/axes/DateHelper.cxx | 17 ++++++++++++++--- chart2/source/view/axes/Tickmarks_Dates.cxx | 6 ++++++ 2 files changed, 20 insertions(+), 3 deletions(-)
New commits: commit 58a2b4a7f9f495eaf058e577ad3419f5a6c93d84 Author: Andre Fischer <[email protected]> Date: Fri Jan 24 10:36:16 2014 +0000 124069: Prevent infinite loop when looking too far into the future. diff --git a/chart2/source/view/axes/DateHelper.cxx b/chart2/source/view/axes/DateHelper.cxx index d007209..3545435 100644 --- a/chart2/source/view/axes/DateHelper.cxx +++ b/chart2/source/view/axes/DateHelper.cxx @@ -78,9 +78,20 @@ Date DateHelper::GetDateSomeMonthsAway( const Date& rD, long nMonthDistance ) Date DateHelper::GetDateSomeYearsAway( const Date& rD, long nYearDistance ) { Date aRet(rD); - aRet.SetYear( static_cast<sal_uInt16>(rD.GetYear()+nYearDistance) ); - while(!aRet.IsValid()) - aRet--; + const long nFutureYear (rD.GetYear()+nYearDistance); + aRet.SetYear(static_cast<sal_uInt16>(nFutureYear)); + if ( ! aRet.IsValid()) + { + // The Date class has the nasty property to store years modulo + // 10000. In order to handle (probably invalid) very large + // year values more gracefully than with an infinite loop we + // check that condition and return an invalid date. + if (nFutureYear < 10000) + { + while ( ! aRet.IsValid()) + --aRet; + } + } return aRet; } diff --git a/chart2/source/view/axes/Tickmarks_Dates.cxx b/chart2/source/view/axes/Tickmarks_Dates.cxx index a6ec18f..749a7be 100644 --- a/chart2/source/view/axes/Tickmarks_Dates.cxx +++ b/chart2/source/view/axes/Tickmarks_Dates.cxx @@ -105,6 +105,7 @@ void DateTickFactory::getAllTicks( ::std::vector< ::std::vector< TickInfo > >& r break; //find next major date + const Date aTmpDate (aDate); switch( m_aIncrement.MajorTimeInterval.TimeUnit ) { case DAY: @@ -118,6 +119,8 @@ void DateTickFactory::getAllTicks( ::std::vector< ::std::vector< TickInfo > >& r aDate = DateHelper::GetDateSomeMonthsAway( aDate, m_aIncrement.MajorTimeInterval.Number ); break; } + if ( ! aDate.IsValid() || aDate == aTmpDate) + break; } //create minor date tickinfos @@ -136,6 +139,7 @@ void DateTickFactory::getAllTicks( ::std::vector< ::std::vector< TickInfo > >& r break; //find next minor date + const Date aTmpDate (aDate); switch( m_aIncrement.MinorTimeInterval.TimeUnit ) { case DAY: @@ -149,6 +153,8 @@ void DateTickFactory::getAllTicks( ::std::vector< ::std::vector< TickInfo > >& r aDate = DateHelper::GetDateSomeMonthsAway( aDate, m_aIncrement.MinorTimeInterval.Number ); break; } + if ( ! aDate.IsValid() || aDate == aTmpDate) + break; } } _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
