@@ -597,12 +597,11 @@ static uint64_t user_generate(void *state) {
597597 size_t size ;
598598 zval retval ;
599599 int i ;
600- char * ptr ;
601600
602601 zend_call_known_instance_method_with_0_params (s -> generate_method , s -> object , & retval );
603602
604603 /* Store generated size in a state */
605- size = Z_STR (retval )-> len ;
604+ size = Z_STRLEN (retval );
606605
607606 /* Guard for over 64-bit results */
608607 if (size > sizeof (uint64_t )) {
@@ -612,9 +611,8 @@ static uint64_t user_generate(void *state) {
612611
613612 if (size > 0 ) {
614613 /* Endianness safe copy */
615- ptr = (char * ) & result ;
616614 for (i = 0 ; i < size ; i ++ ) {
617- ptr [ i ] = Z_STR ( retval )-> val [i ];
615+ result += ( unsigned char ) Z_STRVAL ( retval )[i ] << 8 * i ;
618616 }
619617 } else {
620618 result = 0 ;
@@ -1274,7 +1272,7 @@ PHP_METHOD(Random_Engine_CombinedLCG, generate)
12741272 uint64_t generated ;
12751273 zend_string * bytes ;
12761274 int i ;
1277-
1275+
12781276 ZEND_PARSE_PARAMETERS_NONE ();
12791277
12801278 RANDOM_ENGINE_GENERATE_SIZE (engine -> algo , engine -> state , generated , size );
@@ -1285,7 +1283,6 @@ PHP_METHOD(Random_Engine_CombinedLCG, generate)
12851283 for (i = 0 ; i < size ; i ++ ) {
12861284 ZSTR_VAL (bytes )[i ] = (generated >> (i * 8 )) & 0xff ;
12871285 }
1288-
12891286 ZSTR_VAL (bytes )[size ] = '\0' ;
12901287
12911288 RETURN_STR (bytes );
@@ -1412,6 +1409,7 @@ PHP_METHOD(Random_Engine_XorShift128Plus, __construct)
14121409 php_random_engine_state_xorshift128plus * state = engine -> state ;
14131410 zend_string * str_seed = NULL ;
14141411 zend_long int_seed = 0 ;
1412+ int i , j ;
14151413
14161414 ZEND_PARSE_PARAMETERS_START (1 , 1 )
14171415 Z_PARAM_STR_OR_LONG (str_seed , int_seed )
@@ -1421,10 +1419,10 @@ PHP_METHOD(Random_Engine_XorShift128Plus, __construct)
14211419 /* char (8 bit) * 16 = 128 bits */
14221420 if (str_seed -> len == 16 ) {
14231421 /* Endianness safe copy */
1424- int i ;
1425- char * ptr = ( char * ) & state -> s ;
1426- for ( i = 0 ; i < 16 ; i ++ ) {
1427- ptr [ i ] = str_seed -> val [ i ];
1422+ for ( i = 0 ; i < 2 ; i ++ ) {
1423+ for ( j = 0 ; j < 8 ; j ++ ) {
1424+ state -> s [ i ] += ( unsigned char ) ZSTR_VAL ( str_seed )[( i * j ) + j ] >> ( j * 8 );
1425+ }
14281426 }
14291427 } else {
14301428 zend_argument_value_error (1 , "state strings must be 16 bytes" );
@@ -1443,6 +1441,7 @@ PHP_METHOD(Random_Engine_Xoshiro256StarStar, __construct)
14431441 php_random_engine_state_xoshiro256starstar * state = engine -> state ;
14441442 zend_string * str_seed = NULL ;
14451443 zend_long int_seed = 0 ;
1444+ int i , j ;
14461445
14471446 ZEND_PARSE_PARAMETERS_START (1 , 1 )
14481447 Z_PARAM_STR_OR_LONG (str_seed , int_seed )
@@ -1452,10 +1451,10 @@ PHP_METHOD(Random_Engine_Xoshiro256StarStar, __construct)
14521451 /* char (8 bit) * 32 = 256 bits */
14531452 if (str_seed -> len == 32 ) {
14541453 /* Endianness safe copy */
1455- int i ;
1456- char * ptr = ( char * ) & state -> s ;
1457- for ( i = 0 ; i < 32 ; i ++ ) {
1458- ptr [ i ] = str_seed -> val [ i ];
1454+ for ( i = 0 ; i < 4 ; i ++ ) {
1455+ for ( j = 0 ; j < 8 ; j ++ ) {
1456+ state -> s [ i ] += ( unsigned char ) ZSTR_VAL ( str_seed )[( i * j ) + j ] >> ( j * 8 );
1457+ }
14591458 }
14601459 } else {
14611460 zend_argument_value_error (1 , "state strings must be 32 bytes" );
@@ -1550,7 +1549,7 @@ PHP_METHOD(Random_Randomizer, getBytes)
15501549 }
15511550
15521551 retval = zend_string_alloc (length , 0 );
1553- required_size = length * sizeof ( char ) ;
1552+ required_size = length ;
15541553
15551554 while (total_size < required_size ) {
15561555 uint64_t result ;
@@ -1559,7 +1558,7 @@ PHP_METHOD(Random_Randomizer, getBytes)
15591558 RANDOM_ENGINE_GENERATE_SIZE (randomizer -> algo , randomizer -> state , result , generated_size );
15601559
15611560 for (i = 0 ; i < generated_size ; i ++ ) {
1562- ZSTR_VAL (retval )[total_size ++ ] = (result >> (i * sizeof ( char ) ) & 0xff );
1561+ ZSTR_VAL (retval )[total_size ++ ] = (result >> (i * 8 ) & 0xff );
15631562 if (total_size >= required_size ) {
15641563 break ;
15651564 }
0 commit comments