]> granicus.if.org Git - php/commitdiff
- Fixed bug in SdnToGregorian (see comments on #53574, though that bug is about
authorGustavo André dos Santos Lopes <cataphract@php.net>
Mon, 26 Sep 2011 22:38:21 +0000 (22:38 +0000)
committerGustavo André dos Santos Lopes <cataphract@php.net>
Mon, 26 Sep 2011 22:38:21 +0000 (22:38 +0000)
  another function). NEWS & tests tomorrow.

ext/calendar/gregor.c

index c9c0bf761b438a71bd6edf05f60dbd3a2616f74e..cf9860366c51afd8cc299444be1e1474c5f98f08 100644 (file)
  **************************************************************************/
 
 #include "sdncal.h"
+#include <limits.h>
 
 #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(