diff --git a/NEWS b/NEWS index bde051dee660..d72267e9cc1c 100644 --- a/NEWS +++ b/NEWS @@ -40,6 +40,10 @@ PHP NEWS . Fixed bug GH-23619 (cryptic error on servers that don't support TLS session resumption on data connection). (ndossche) +- Hash: + . Fixed mhash_keygen_s2k() truncating a $length above INT_MAX instead of + throwing a ValueError. (Marc Bennewitz) + - Intl: . Fixed cloning IntlDateFormatter and MessageFormatter losing PHP-side state such as dateType, timeType, calendar and the message pattern. diff --git a/ext/hash/hash.c b/ext/hash/hash.c index 93401852ad3d..615a8325fc5f 100644 --- a/ext/hash/hash.c +++ b/ext/hash/hash.c @@ -1294,12 +1294,18 @@ PHP_FUNCTION(mhash_keygen_s2k) RETURN_THROWS(); } - bytes = (int)l_bytes; - if (bytes <= 0){ + if (l_bytes <= 0) { zend_argument_value_error(4, "must be a greater than 0"); RETURN_THROWS(); } + if (ZEND_LONG_INT_OVFL(l_bytes)) { + zend_argument_value_error(4, "must be less than or equal to %d", INT_MAX); + RETURN_THROWS(); + } + + bytes = (int)l_bytes; + salt_len = MIN(salt_len, SALT_SIZE); memcpy(padded_salt, salt, salt_len); diff --git a/ext/hash/tests/gh23950.phpt b/ext/hash/tests/gh23950.phpt new file mode 100644 index 000000000000..d9aa7dea4081 --- /dev/null +++ b/ext/hash/tests/gh23950.phpt @@ -0,0 +1,29 @@ +--TEST-- +MHash: GH-23950 (mhash_keygen_s2k() $length must not be truncated to int) +--SKIPIF-- + +--FILE-- +getMessage(), "\n"; + } +} +?> +--EXPECTF-- +Deprecated: Function mhash_keygen_s2k() is deprecated since 8.1 in %s on line %d +ValueError: mhash_keygen_s2k(): Argument #4 ($length) must be less than or equal to 2147483647 + +Deprecated: Function mhash_keygen_s2k() is deprecated since 8.1 in %s on line %d +ValueError: mhash_keygen_s2k(): Argument #4 ($length) must be less than or equal to 2147483647 + +Deprecated: Function mhash_keygen_s2k() is deprecated since 8.1 in %s on line %d +ValueError: mhash_keygen_s2k(): Argument #4 ($length) must be less than or equal to 2147483647 + +Deprecated: Function mhash_keygen_s2k() is deprecated since 8.1 in %s on line %d +ValueError: mhash_keygen_s2k(): Argument #4 ($length) must be less than or equal to 2147483647