cataphract                               Mon, 26 Sep 2011 22:38:21 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=317360

Log:
- Fixed bug in SdnToGregorian (see comments on #53574, though that bug is about
  another function). NEWS & tests tomorrow.

Bug: https://bugs.php.net/53574 (Re-Opened) Integer overflow in SdnToJulian
      
Changed paths:
    U   php/php-src/branches/PHP_5_3/ext/calendar/gregor.c
    U   php/php-src/branches/PHP_5_4/ext/calendar/gregor.c
    U   php/php-src/trunk/ext/calendar/gregor.c

Modified: php/php-src/branches/PHP_5_3/ext/calendar/gregor.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/calendar/gregor.c  2011-09-26 21:36:33 UTC 
(rev 317359)
+++ php/php-src/branches/PHP_5_3/ext/calendar/gregor.c  2011-09-26 22:38:21 UTC 
(rev 317360)
@@ -127,6 +127,7 @@
  **************************************************************************/

 #include "sdncal.h"
+#include <limits.h>

 #define GREGOR_SDN_OFFSET         32045
 #define DAYS_PER_5_MONTHS  153
@@ -146,19 +147,14 @@
        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 @@
        *pYear = year;
        *pMonth = month;
        *pDay = day;
+fail:
+       *pYear = 0;
+       *pMonth = 0;
+       *pDay = 0;
 }

 long int GregorianToSdn(

Modified: php/php-src/branches/PHP_5_4/ext/calendar/gregor.c
===================================================================
--- php/php-src/branches/PHP_5_4/ext/calendar/gregor.c  2011-09-26 21:36:33 UTC 
(rev 317359)
+++ php/php-src/branches/PHP_5_4/ext/calendar/gregor.c  2011-09-26 22:38:21 UTC 
(rev 317360)
@@ -127,6 +127,7 @@
  **************************************************************************/

 #include "sdncal.h"
+#include <limits.h>

 #define GREGOR_SDN_OFFSET         32045
 #define DAYS_PER_5_MONTHS  153
@@ -146,19 +147,14 @@
        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 @@
        *pYear = year;
        *pMonth = month;
        *pDay = day;
+fail:
+       *pYear = 0;
+       *pMonth = 0;
+       *pDay = 0;
 }

 long int GregorianToSdn(

Modified: php/php-src/trunk/ext/calendar/gregor.c
===================================================================
--- php/php-src/trunk/ext/calendar/gregor.c     2011-09-26 21:36:33 UTC (rev 
317359)
+++ php/php-src/trunk/ext/calendar/gregor.c     2011-09-26 22:38:21 UTC (rev 
317360)
@@ -127,6 +127,7 @@
  **************************************************************************/

 #include "sdncal.h"
+#include <limits.h>

 #define GREGOR_SDN_OFFSET         32045
 #define DAYS_PER_5_MONTHS  153
@@ -146,19 +147,14 @@
        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 @@
        *pYear = year;
        *pMonth = month;
        *pDay = day;
+fail:
+       *pYear = 0;
+       *pMonth = 0;
+       *pDay = 0;
 }

 long int GregorianToSdn(

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to