From: Gustavo André dos Santos Lopes Date: Mon, 26 Sep 2011 22:38:21 +0000 (+0000) Subject: - Fixed bug in SdnToGregorian (see comments on #53574, though that bug is about X-Git-Tag: php-5.3.9RC1~83 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=43f215a463edc2c5264a7efc20a89695c8cc7091;p=php - Fixed bug in SdnToGregorian (see comments on #53574, though that bug is about another function). NEWS & tests tomorrow. --- 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(