]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.4' into master
authorChristoph M. Becker <cmbecker69@gmx.de>
Wed, 7 Oct 2020 11:28:22 +0000 (13:28 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Wed, 7 Oct 2020 12:09:32 +0000 (14:09 +0200)
* PHP-7.4:
  Fix #80185: jdtounix() fails after 2037

1  2 
ext/calendar/cal_unix.c
ext/calendar/tests/bug80185.phpt
ext/calendar/tests/bug80185_32bit.phpt
ext/calendar/tests/jdtounix_error1.phpt

index 55d67823ff97aab32611b53b4e0fd465fe07369e,864499c9cc3628699df8a7165c3bb972c418f8c7..f1740c86afa6f105a1b296292a5780a266256e87
  #include "sdncal.h"
  #include <time.h>
  
 -/* {{{ proto int unixtojd([int timestamp])
 -   Convert UNIX timestamp to Julian Day */
+ #define SECS_PER_DAY (24 * 3600)
 +/* {{{ Convert UNIX timestamp to Julian Day */
  PHP_FUNCTION(unixtojd)
  {
 -      time_t ts = 0;
 +      time_t ts;
        zend_long tl = 0;
 +      zend_bool tl_is_null = 1;
        struct tm *ta, tmbuf;
  
 -      if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &tl) == FAILURE) {
 -              return;
 +      if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!", &tl, &tl_is_null) == FAILURE) {
 +              RETURN_THROWS();
        }
  
 -      if (!tl) {
 +      if (tl_is_null) {
                ts = time(NULL);
        } else if (tl >= 0) {
                ts = (time_t) tl;
@@@ -60,11 -64,10 +62,11 @@@ PHP_FUNCTION(jdtounix
        }
        uday -= 2440588 /* J.D. of 1.1.1970 */;
  
-       if (uday < 0 || uday > 24755) {
-               zend_value_error("jday must be within the Unix epoch");
+       if (uday < 0 || uday > ZEND_LONG_MAX / SECS_PER_DAY) { /* before beginning of unix epoch or greater than representable */
 -              RETURN_FALSE;
++              zend_value_error("jday must be between 2440588 and " ZEND_LONG_FMT, ZEND_LONG_MAX / SECS_PER_DAY + 2440588);
 +              RETURN_THROWS();
        }
  
-       RETURN_LONG(uday * 24 * 3600);
+       RETURN_LONG(uday * SECS_PER_DAY);
  }
  /* }}} */
index 0000000000000000000000000000000000000000,cd9ddb7d2979e84196bd0030b3fd73451827e3d2..eab5cf1c4bf9b455a0cd5dc8f9ab9070abd096d8
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,17 +1,21 @@@
 -var_dump(jdtounix(PHP_INT_MAX / 86400 + 2440589));
+ --TEST--
+ Bug #80185 (jdtounix() fails after 2037)
+ --SKIPIF--
+ <?php
+ if (!extension_loaded('calendar')) die('skip ext/calendar required');
+ if (PHP_INT_SIZE != 8) die("skip for 64bit platforms only");
+ ?>
+ --FILE--
+ <?php
+ var_dump(jdtounix(2465712));
+ var_dump(jdtounix(PHP_INT_MAX / 86400 + 2440588));
 -bool(false)
++try {
++    var_dump(jdtounix(PHP_INT_MAX / 86400 + 2440589));
++} catch (ValueError $ex) {
++    echo $ex->getMessage(), PHP_EOL;
++}
+ ?>
+ --EXPECT--
+ int(2170713600)
+ int(9223372036854720000)
++jday must be between 2440588 and 106751993607888
index 0000000000000000000000000000000000000000,95ee050171eb9e6ea9ae2b171aabf3c3c810a9c4..98a1bea2a3d63d34441cc0e0fe1cb167ef41025f
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,17 +1,25 @@@
 -var_dump(jdtounix(2465712));
+ --TEST--
+ Bug #80185 (jdtounix() fails after 2037)
+ --SKIPIF--
+ <?php
+ if (!extension_loaded('calendar')) die('skip ext/calendar required');
+ if (PHP_INT_SIZE != 4) die("skip for 32bit platforms only");
+ ?>
+ --FILE--
+ <?php
 -var_dump(jdtounix(PHP_INT_MAX / 86400 + 2440589));
++try {
++    var_dump(jdtounix(2465712));
++} catch (ValueError $ex) {
++    echo $ex->getMessage(), PHP_EOL;
++}
+ var_dump(jdtounix(PHP_INT_MAX / 86400 + 2440588));
 -bool(false)
++try {
++    var_dump(jdtounix(PHP_INT_MAX / 86400 + 2440589));
++} catch (ValueError $ex) {
++    echo $ex->getMessage(), PHP_EOL;
++}
+ ?>
+ --EXPECT--
 -bool(false)
++jday must be between 2440588 and 2465443
+ int(2147472000)
++jday must be between 2440588 and 2465443
index e47cced1b1accd0fa9869df63802c22d2e02cec7,5d4ea38834d0f419a1c573c7410c76f0ec66d4a3..de266ac6a2dcc6621a475c5eed5c2a589c8107e7
@@@ -8,11 -8,7 +8,11 @@@ date.timezone=UT
  <?php include 'skipif.inc'; ?>
  --FILE--
  <?php
 -var_dump(jdtounix(2440579)) . PHP_EOL;
 +try {
 +    jdtounix(2440579);
 +} catch (ValueError $ex) {
 +    echo $ex->getMessage(), PHP_EOL;
 +}
  ?>
  --EXPECT--
- jday must be within the Unix epoch
 -bool(false)
++jday must be between 2440588 and 2465443