@@ -597,12 +597,11 @@ static uint64_t user_generate(void *state) {
597
597
size_t size ;
598
598
zval retval ;
599
599
int i ;
600
- char * ptr ;
601
600
602
601
zend_call_known_instance_method_with_0_params (s -> generate_method , s -> object , & retval );
603
602
604
603
/* Store generated size in a state */
605
- size = Z_STR (retval )-> len ;
604
+ size = Z_STRLEN (retval );
606
605
607
606
/* Guard for over 64-bit results */
608
607
if (size > sizeof (uint64_t )) {
@@ -612,9 +611,8 @@ static uint64_t user_generate(void *state) {
612
611
613
612
if (size > 0 ) {
614
613
/* Endianness safe copy */
615
- ptr = (char * ) & result ;
616
614
for (i = 0 ; i < size ; i ++ ) {
617
- ptr [ i ] = Z_STR ( retval )-> val [i ];
615
+ result += ( unsigned char ) Z_STRVAL ( retval )[i ] << 8 * i ;
618
616
}
619
617
} else {
620
618
result = 0 ;
@@ -1274,7 +1272,7 @@ PHP_METHOD(Random_Engine_CombinedLCG, generate)
1274
1272
uint64_t generated ;
1275
1273
zend_string * bytes ;
1276
1274
int i ;
1277
-
1275
+
1278
1276
ZEND_PARSE_PARAMETERS_NONE ();
1279
1277
1280
1278
RANDOM_ENGINE_GENERATE_SIZE (engine -> algo , engine -> state , generated , size );
@@ -1285,7 +1283,6 @@ PHP_METHOD(Random_Engine_CombinedLCG, generate)
1285
1283
for (i = 0 ; i < size ; i ++ ) {
1286
1284
ZSTR_VAL (bytes )[i ] = (generated >> (i * 8 )) & 0xff ;
1287
1285
}
1288
-
1289
1286
ZSTR_VAL (bytes )[size ] = '\0' ;
1290
1287
1291
1288
RETURN_STR (bytes );
@@ -1412,6 +1409,7 @@ PHP_METHOD(Random_Engine_XorShift128Plus, __construct)
1412
1409
php_random_engine_state_xorshift128plus * state = engine -> state ;
1413
1410
zend_string * str_seed = NULL ;
1414
1411
zend_long int_seed = 0 ;
1412
+ int i , j ;
1415
1413
1416
1414
ZEND_PARSE_PARAMETERS_START (1 , 1 )
1417
1415
Z_PARAM_STR_OR_LONG (str_seed , int_seed )
@@ -1421,10 +1419,10 @@ PHP_METHOD(Random_Engine_XorShift128Plus, __construct)
1421
1419
/* char (8 bit) * 16 = 128 bits */
1422
1420
if (str_seed -> len == 16 ) {
1423
1421
/* 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
+ }
1428
1426
}
1429
1427
} else {
1430
1428
zend_argument_value_error (1 , "state strings must be 16 bytes" );
@@ -1443,6 +1441,7 @@ PHP_METHOD(Random_Engine_Xoshiro256StarStar, __construct)
1443
1441
php_random_engine_state_xoshiro256starstar * state = engine -> state ;
1444
1442
zend_string * str_seed = NULL ;
1445
1443
zend_long int_seed = 0 ;
1444
+ int i , j ;
1446
1445
1447
1446
ZEND_PARSE_PARAMETERS_START (1 , 1 )
1448
1447
Z_PARAM_STR_OR_LONG (str_seed , int_seed )
@@ -1452,10 +1451,10 @@ PHP_METHOD(Random_Engine_Xoshiro256StarStar, __construct)
1452
1451
/* char (8 bit) * 32 = 256 bits */
1453
1452
if (str_seed -> len == 32 ) {
1454
1453
/* 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
+ }
1459
1458
}
1460
1459
} else {
1461
1460
zend_argument_value_error (1 , "state strings must be 32 bytes" );
@@ -1550,7 +1549,7 @@ PHP_METHOD(Random_Randomizer, getBytes)
1550
1549
}
1551
1550
1552
1551
retval = zend_string_alloc (length , 0 );
1553
- required_size = length * sizeof ( char ) ;
1552
+ required_size = length ;
1554
1553
1555
1554
while (total_size < required_size ) {
1556
1555
uint64_t result ;
@@ -1559,7 +1558,7 @@ PHP_METHOD(Random_Randomizer, getBytes)
1559
1558
RANDOM_ENGINE_GENERATE_SIZE (randomizer -> algo , randomizer -> state , result , generated_size );
1560
1559
1561
1560
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 );
1563
1562
if (total_size >= required_size ) {
1564
1563
break ;
1565
1564
}
0 commit comments