From e932aef17b469c20b648d6f8bb3743538ca38256 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Gustavo=20Andr=C3=A9=20dos=20Santos=20Lopes?= Date: Mon, 26 Sep 2011 22:38:21 +0000 Subject: [PATCH] - Fixed bug in SdnToGregorian (see comments on #53574, though that bug is about another function). NEWS & tests tomorrow. --- ext/calendar/gregor.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/calendar/gregor.c b/ext/calendar/gregor.c index c9c0bf761b..cf9860366c 100644 --- a/ext/calendar/gregor.c +++ b/ext/calendar/gregor.c @@ -127,6 +127,7 @@ **************************************************************************/ #include "sdncal.h" +#include #define GREGOR_SDN_OFFSET 32045 #define DAYS_PER_5_MONTHS 153 @@ -146,19 +147,14 @@ void SdnToGregorian( long int temp; int dayOfYear; - if (sdn <= 0) { - *pYear = 0; - *pMonth = 0; - *pDay = 0; - return; + if (sdn <= 0 || + sdn > (LONG_MAX - 4 * GREGOR_SDN_OFFSET) / 4) { + goto fail; } temp = (sdn + GREGOR_SDN_OFFSET) * 4 - 1; if (temp < 0) { - *pYear = 0; - *pMonth = 0; - *pDay = 0; - return; + goto fail; } /* Calculate the century (year/100). */ @@ -190,6 +186,10 @@ void SdnToGregorian( *pYear = year; *pMonth = month; *pDay = day; +fail: + *pYear = 0; + *pMonth = 0; + *pDay = 0; } long int GregorianToSdn( -- 2.50.1