From be844f9f47ed328fa0255b596901723b946a27df Mon Sep 17 00:00:00 2001
From: Gina Peter Banyard <girgias@php.net>
Date: Sat, 26 Apr 2025 13:17:00 +0100
Subject: [PATCH 1/6] ext/random: Reduce scope of variables

---
 ext/random/engine_mt19937.c             | 4 ++--
 ext/random/engine_pcgoneseq128xslrr64.c | 3 +--
 ext/random/engine_xoshiro256starstar.c  | 3 +--
 ext/random/randomizer.c                 | 3 ++-
 4 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/ext/random/engine_mt19937.c b/ext/random/engine_mt19937.c
index 7c9d1741d81f1..9f395eefa05f7 100644
--- a/ext/random/engine_mt19937.c
+++ b/ext/random/engine_mt19937.c
@@ -127,7 +127,7 @@ static inline void mt19937_reload(php_random_status_state_mt19937 *state)
 
 PHPAPI inline void php_random_mt19937_seed32(php_random_status_state_mt19937 *state, uint32_t seed)
 {
-	uint32_t i, prev_state;
+	uint32_t i;
 
 	/* Initialize generator state with seed
 	   See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier.
@@ -135,7 +135,7 @@ PHPAPI inline void php_random_mt19937_seed32(php_random_status_state_mt19937 *st
 	   only MSBs of the state array.  Modified 9 Jan 2002 by Makoto Matsumoto. */
 	state->state[0] = seed;
 	for (i = 1; i < N; i++) {
-		prev_state = state->state[i - 1];
+		uint32_t prev_state = state->state[i - 1];
 		state->state[i] = (1812433253U * (prev_state  ^ (prev_state  >> 30)) + i) & 0xffffffffU;
 	}
 	state->count = i;
diff --git a/ext/random/engine_pcgoneseq128xslrr64.c b/ext/random/engine_pcgoneseq128xslrr64.c
index 9ff4f911920b2..71da0664f977b 100644
--- a/ext/random/engine_pcgoneseq128xslrr64.c
+++ b/ext/random/engine_pcgoneseq128xslrr64.c
@@ -84,7 +84,6 @@ static bool unserialize(void *state, HashTable *data)
 {
 	php_random_status_state_pcgoneseq128xslrr64 *s = state;
 	uint64_t u[2];
-	zval *t;
 
 	/* Verify the expected number of elements, this implicitly ensures that no additional elements are present. */
 	if (zend_hash_num_elements(data) != 2) {
@@ -92,7 +91,7 @@ static bool unserialize(void *state, HashTable *data)
 	}
 
 	for (uint32_t i = 0; i < 2; i++) {
-		t = zend_hash_index_find(data, i);
+		zval *t = zend_hash_index_find(data, i);
 		if (!t || Z_TYPE_P(t) != IS_STRING || Z_STRLEN_P(t) != (2 * sizeof(uint64_t))) {
 			return false;
 		}
diff --git a/ext/random/engine_xoshiro256starstar.c b/ext/random/engine_xoshiro256starstar.c
index 1a054362f0652..6007cb96846b5 100644
--- a/ext/random/engine_xoshiro256starstar.c
+++ b/ext/random/engine_xoshiro256starstar.c
@@ -134,7 +134,6 @@ static bool serialize(void *state, HashTable *data)
 static bool unserialize(void *state, HashTable *data)
 {
 	php_random_status_state_xoshiro256starstar *s = state;
-	zval *t;
 
 	/* Verify the expected number of elements, this implicitly ensures that no additional elements are present. */
 	if (zend_hash_num_elements(data) != 4) {
@@ -142,7 +141,7 @@ static bool unserialize(void *state, HashTable *data)
 	}
 
 	for (uint32_t i = 0; i < 4; i++) {
-		t = zend_hash_index_find(data, i);
+		zval *t = zend_hash_index_find(data, i);
 		if (!t || Z_TYPE_P(t) != IS_STRING || Z_STRLEN_P(t) != (2 * sizeof(uint64_t))) {
 			return false;
 		}
diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c
index 0585ea95e668e..ac0829325e287 100644
--- a/ext/random/randomizer.c
+++ b/ext/random/randomizer.c
@@ -388,7 +388,7 @@ PHP_METHOD(Random_Randomizer, shuffleBytes)
 PHP_METHOD(Random_Randomizer, pickArrayKeys)
 {
 	php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
-	zval *input, t;
+	zval *input;
 	zend_long num_req;
 
 	ZEND_PARSE_PARAMETERS_START(2, 2);
@@ -408,6 +408,7 @@ PHP_METHOD(Random_Randomizer, pickArrayKeys)
 
 	/* Keep compatibility, But the result is always an array */
 	if (Z_TYPE_P(return_value) != IS_ARRAY) {
+		zval t;
 		ZVAL_COPY_VALUE(&t, return_value);
 		array_init(return_value);
 		zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &t);

From 8238c8e242e58a6073175db15bd13e53307ec10d Mon Sep 17 00:00:00 2001
From: Gina Peter Banyard <girgias@php.net>
Date: Sat, 26 Apr 2025 13:17:23 +0100
Subject: [PATCH 2/6] ext/random: Add const qualifier

---
 ext/random/engine_mt19937.c             |  2 +-
 ext/random/engine_pcgoneseq128xslrr64.c |  2 +-
 ext/random/engine_xoshiro256starstar.c  |  2 +-
 ext/random/random.c                     | 13 +++++++------
 ext/random/randomizer.c                 | 22 +++++++++++-----------
 5 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/ext/random/engine_mt19937.c b/ext/random/engine_mt19937.c
index 9f395eefa05f7..7b91c45648e92 100644
--- a/ext/random/engine_mt19937.c
+++ b/ext/random/engine_mt19937.c
@@ -188,7 +188,7 @@ static bool serialize(void *state, HashTable *data)
 	return true;
 }
 
-static bool unserialize(void *state, HashTable *data)
+static bool unserialize(void *state, const HashTable *data)
 {
 	php_random_status_state_mt19937 *s = state;
 	zval *t;
diff --git a/ext/random/engine_pcgoneseq128xslrr64.c b/ext/random/engine_pcgoneseq128xslrr64.c
index 71da0664f977b..ffb6385540f10 100644
--- a/ext/random/engine_pcgoneseq128xslrr64.c
+++ b/ext/random/engine_pcgoneseq128xslrr64.c
@@ -80,7 +80,7 @@ static bool serialize(void *state, HashTable *data)
 	return true;
 }
 
-static bool unserialize(void *state, HashTable *data)
+static bool unserialize(void *state, const HashTable *data)
 {
 	php_random_status_state_pcgoneseq128xslrr64 *s = state;
 	uint64_t u[2];
diff --git a/ext/random/engine_xoshiro256starstar.c b/ext/random/engine_xoshiro256starstar.c
index 6007cb96846b5..d46ecda97e713 100644
--- a/ext/random/engine_xoshiro256starstar.c
+++ b/ext/random/engine_xoshiro256starstar.c
@@ -131,7 +131,7 @@ static bool serialize(void *state, HashTable *data)
 	return true;
 }
 
-static bool unserialize(void *state, HashTable *data)
+static bool unserialize(void *state, const HashTable *data)
 {
 	php_random_status_state_xoshiro256starstar *s = state;
 
diff --git a/ext/random/random.c b/ext/random/random.c
index 46a6c4fd44f2c..e2eee39a34748 100644
--- a/ext/random/random.c
+++ b/ext/random/random.c
@@ -240,7 +240,7 @@ PHPAPI void *php_random_status_alloc(const php_random_algo *algo, const bool per
 	return algo->state_size > 0 ? pecalloc(1, algo->state_size, persistent) : NULL;
 }
 
-PHPAPI void *php_random_status_copy(const php_random_algo *algo, void *old_status, void *new_status)
+PHPAPI void *php_random_status_copy(const php_random_algo *algo, const void *old_status, void *new_status)
 {
 	return memcpy(new_status, old_status, algo->state_size);
 }
@@ -250,7 +250,7 @@ PHPAPI void php_random_status_free(void *status, const bool persistent)
 	pefree(status, persistent);
 }
 
-PHPAPI php_random_engine *php_random_engine_common_init(zend_class_entry *ce, zend_object_handlers *handlers, const php_random_algo *algo)
+PHPAPI php_random_engine *php_random_engine_common_init(zend_class_entry *ce, const zend_object_handlers *handlers, const php_random_algo *algo)
 {
 	php_random_engine *engine = zend_object_alloc(sizeof(php_random_engine), ce);
 
@@ -355,10 +355,11 @@ PHPAPI zend_string *php_random_bin2hex_le(const void *ptr, const size_t len)
 
 /* {{{ php_random_hex2bin_le */
 /* stolen from standard/string.c */
-PHPAPI bool php_random_hex2bin_le(zend_string *hexstr, void *dest)
+PHPAPI bool php_random_hex2bin_le(const zend_string *hexstr, void *dest)
 {
 	size_t len = hexstr->len >> 1;
-	unsigned char *str = (unsigned char *) hexstr->val, c, l, d;
+	const unsigned char *str = (unsigned char *) hexstr->val;
+	unsigned char c, l, d;
 	unsigned char *ptr = (unsigned char *) dest;
 	int is_letter, i = 0;
 
@@ -462,7 +463,7 @@ PHPAPI zend_long php_mt_rand_range(zend_long min, zend_long max)
  * rand() allows min > max, mt_rand does not */
 PHPAPI zend_long php_mt_rand_common(zend_long min, zend_long max)
 {
-	php_random_status_state_mt19937 *s = php_random_default_status();
+	const php_random_status_state_mt19937 *s = php_random_default_status();
 
 	if (s->mode == MT_RAND_MT19937) {
 		return php_mt_rand_range(min, max);
@@ -633,7 +634,7 @@ PHP_FUNCTION(random_int)
 }
 /* }}} */
 
-static inline void fallback_seed_add(PHP_SHA1_CTX *c, void *p, size_t l){
+static inline void fallback_seed_add(PHP_SHA1_CTX *c, const void *p, size_t l){
 	/* Wrapper around PHP_SHA1Update allowing to pass
 	 * arbitrary pointers without (unsigned char*) casts
 	 * everywhere.
diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c
index ac0829325e287..6a1094cf3e7dd 100644
--- a/ext/random/randomizer.c
+++ b/ext/random/randomizer.c
@@ -93,7 +93,7 @@ PHP_METHOD(Random_Randomizer, __construct)
 /* {{{ Generate a float in [0, 1) */
 PHP_METHOD(Random_Randomizer, nextFloat)
 {
-	php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
+	const php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
 	php_random_algo_with_state engine = randomizer->engine;
 
 	uint64_t result;
@@ -136,7 +136,7 @@ PHP_METHOD(Random_Randomizer, nextFloat)
  */
 PHP_METHOD(Random_Randomizer, getFloat)
 {
-	php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
+	const php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
 	double min, max;
 	zend_object *bounds = NULL;
 	int bounds_type = 'C' + sizeof("ClosedOpen") - 1;
@@ -159,8 +159,8 @@ PHP_METHOD(Random_Randomizer, getFloat)
 	}
 
 	if (bounds) {
-		zval *case_name = zend_enum_fetch_case_name(bounds);
-		zend_string *bounds_name = Z_STR_P(case_name);
+		const zval *case_name = zend_enum_fetch_case_name(bounds);
+		const zend_string *bounds_name = Z_STR_P(case_name);
 
 		bounds_type = ZSTR_VAL(bounds_name)[0] + ZSTR_LEN(bounds_name);
 	}
@@ -210,7 +210,7 @@ PHP_METHOD(Random_Randomizer, getFloat)
 /* {{{ Generate positive random number */
 PHP_METHOD(Random_Randomizer, nextInt)
 {
-	php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
+	const php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
 	php_random_algo_with_state engine = randomizer->engine;
 
 	ZEND_PARSE_PARAMETERS_NONE();
@@ -231,7 +231,7 @@ PHP_METHOD(Random_Randomizer, nextInt)
 /* {{{ Generate random number in range */
 PHP_METHOD(Random_Randomizer, getInt)
 {
-	php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
+	const php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
 	php_random_algo_with_state engine = randomizer->engine;
 
 	uint64_t result;
@@ -274,7 +274,7 @@ PHP_METHOD(Random_Randomizer, getInt)
 /* {{{ Generate random bytes string in ordered length */
 PHP_METHOD(Random_Randomizer, getBytes)
 {
-	php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
+	const php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
 	php_random_algo_with_state engine = randomizer->engine;
 
 	zend_string *retval;
@@ -349,7 +349,7 @@ PHP_METHOD(Random_Randomizer, getBytes)
 /* {{{ Shuffling array */
 PHP_METHOD(Random_Randomizer, shuffleArray)
 {
-	php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
+	const php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
 	zval *array;
 
 	ZEND_PARSE_PARAMETERS_START(1, 1)
@@ -366,7 +366,7 @@ PHP_METHOD(Random_Randomizer, shuffleArray)
 /* {{{ Shuffling binary */
 PHP_METHOD(Random_Randomizer, shuffleBytes)
 {
-	php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
+	const php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
 	zend_string *bytes;
 
 	ZEND_PARSE_PARAMETERS_START(1, 1)
@@ -387,7 +387,7 @@ PHP_METHOD(Random_Randomizer, shuffleBytes)
 /* {{{ Pick keys */
 PHP_METHOD(Random_Randomizer, pickArrayKeys)
 {
-	php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
+	const php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
 	zval *input;
 	zend_long num_req;
 
@@ -419,7 +419,7 @@ PHP_METHOD(Random_Randomizer, pickArrayKeys)
 /* {{{ Get Random Bytes for String */
 PHP_METHOD(Random_Randomizer, getBytesFromString)
 {
-	php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
+	const php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
 	php_random_algo_with_state engine = randomizer->engine;
 
 	zend_long user_length;

From 49dc1290b94e6354c589b5e296aa45ca8b0632a2 Mon Sep 17 00:00:00 2001
From: Gina Peter Banyard <girgias@php.net>
Date: Sat, 26 Apr 2025 13:33:08 +0100
Subject: [PATCH 3/6] ext/random: Use uint32_t type instead of int type

---
 ext/random/random.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ext/random/random.c b/ext/random/random.c
index e2eee39a34748..53b32a7fcd9f7 100644
--- a/ext/random/random.c
+++ b/ext/random/random.c
@@ -361,7 +361,7 @@ PHPAPI bool php_random_hex2bin_le(const zend_string *hexstr, void *dest)
 	const unsigned char *str = (unsigned char *) hexstr->val;
 	unsigned char c, l, d;
 	unsigned char *ptr = (unsigned char *) dest;
-	int is_letter, i = 0;
+	uint32_t is_letter, i = 0;
 
 #ifdef WORDS_BIGENDIAN
 	/* force little endian */

From e3328177c2d07649505187ac88d461e45cbc753d Mon Sep 17 00:00:00 2001
From: Gina Peter Banyard <girgias@php.net>
Date: Sat, 26 Apr 2025 13:33:47 +0100
Subject: [PATCH 4/6] ext/random: Use zend_string macro instead of accessing
 value directly

---
 ext/random/random.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ext/random/random.c b/ext/random/random.c
index 53b32a7fcd9f7..11d3bcea5d3d0 100644
--- a/ext/random/random.c
+++ b/ext/random/random.c
@@ -358,7 +358,7 @@ PHPAPI zend_string *php_random_bin2hex_le(const void *ptr, const size_t len)
 PHPAPI bool php_random_hex2bin_le(const zend_string *hexstr, void *dest)
 {
 	size_t len = hexstr->len >> 1;
-	const unsigned char *str = (unsigned char *) hexstr->val;
+	const unsigned char *str = (unsigned char *) ZSTR_VAL(hexstr);
 	unsigned char c, l, d;
 	unsigned char *ptr = (unsigned char *) dest;
 	uint32_t is_letter, i = 0;

From b43bfd8c481e625be9ba99d12b77913ae665d523 Mon Sep 17 00:00:00 2001
From: Gina Peter Banyard <girgias@php.net>
Date: Sat, 26 Apr 2025 13:36:28 +0100
Subject: [PATCH 5/6] ext/random: Remove useless variable

---
 ext/random/random.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/ext/random/random.c b/ext/random/random.c
index 11d3bcea5d3d0..1a0b520c141bf 100644
--- a/ext/random/random.c
+++ b/ext/random/random.c
@@ -525,9 +525,8 @@ PHP_FUNCTION(mt_srand)
 PHP_FUNCTION(mt_rand)
 {
 	zend_long min, max;
-	int argc = ZEND_NUM_ARGS();
 
-	if (argc == 0) {
+	if (ZEND_NUM_ARGS() == 0) {
 		/* genrand_int31 in mt19937ar.c performs a right shift */
 		RETURN_LONG(php_mt_rand() >> 1);
 	}
@@ -563,9 +562,8 @@ PHP_FUNCTION(mt_getrandmax)
 PHP_FUNCTION(rand)
 {
 	zend_long min, max;
-	int argc = ZEND_NUM_ARGS();
 
-	if (argc == 0) {
+	if (ZEND_NUM_ARGS() == 0) {
 		/* genrand_int31 in mt19937ar.c performs a right shift */
 		RETURN_LONG(php_mt_rand() >> 1);
 	}

From a0675b2110a5c3a35cd8c515662bfa0b25ebcffa Mon Sep 17 00:00:00 2001
From: Gina Peter Banyard <girgias@php.net>
Date: Sat, 26 Apr 2025 13:46:28 +0100
Subject: [PATCH 6/6] ext/random: CS nits

---
 ext/random/randomizer.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c
index 6a1094cf3e7dd..19c21f620aa78 100644
--- a/ext/random/randomizer.c
+++ b/ext/random/randomizer.c
@@ -330,7 +330,7 @@ PHP_METHOD(Random_Randomizer, getBytes)
 			RETURN_THROWS();
 		}
 
- non_64:
+non_64:
 
 		for (size_t i = 0; i < result.size; i++) {
 			ZSTR_VAL(retval)[total_size++] = result.result & 0xff;