From 73e8a1821228d7efb491233f87cf79ccb3c71d0f Mon Sep 17 00:00:00 2001 From: Marc Bennewitz Date: Sun, 27 Sep 2026 22:34:09 +0200 Subject: [PATCH] Fix mhash_keygen_s2k() $length truncation to int A $length above INT_MAX was truncated to int before the range check, so e.g. 2**32 + 16 silently returned 16 bytes. Throw a ValueError instead. --- NEWS | 4 ++++ ext/hash/hash.c | 10 ++++++++-- ext/hash/tests/gh23950.phpt | 29 +++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 ext/hash/tests/gh23950.phpt 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