Skip to content
1 change: 1 addition & 0 deletions ext/calendar/gregor.c
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ zend_long GregorianToSdn(

/* check for invalid dates */
if (inputYear == 0 || inputYear < -4714 ||
inputYear > INT_MAX - 4800 ||
inputMonth <= 0 || inputMonth > 12 ||
inputDay <= 0 || inputDay > 31) {
return (0);
Expand Down
1 change: 1 addition & 0 deletions ext/calendar/julian.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,7 @@ zend_long JulianToSdn(

/* check for invalid dates */
if (inputYear == 0 || inputYear < -4713 ||
inputYear > INT_MAX - 4800 ||
inputMonth <= 0 || inputMonth > 12 ||
inputDay <= 0 || inputDay > 31) {
return (0);
Expand Down
20 changes: 20 additions & 0 deletions ext/calendar/tests/gh22602.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
--TEST--
Bug GH-22602: (gregoriantojd() and juliantojd() integer overflow with INT_MAX year)
--EXTENSIONS--
calendar
--FILE--
<?php
$max = PHP_INT_MAX > 2147483647 ? 2147483647 : PHP_INT_MAX;
$min = PHP_INT_MAX > 2147483647 ? -2147483648 : PHP_INT_MIN;

var_dump(gregoriantojd(5, 5, $max));
var_dump(gregoriantojd(5, 5, $min));
var_dump(juliantojd(5, 5, 2147483647));
var_dump(juliantojd(5, 5, -2147483647));

?>
--EXPECT--
int(0)
int(0)
int(0)
int(0)
Loading