@@ -615,6 +615,7 @@ static uint64_t user_generate(void *state) {
615
615
uint64_t result = 0 ;
616
616
size_t size ;
617
617
zval retval ;
618
+ int i ;
618
619
619
620
zend_call_known_instance_method_with_0_params (s -> generate_method , s -> object , & retval );
620
621
@@ -623,7 +624,12 @@ static uint64_t user_generate(void *state) {
623
624
if (size > sizeof (uint64_t )) {
624
625
size = sizeof (uint64_t );
625
626
}
626
- memcpy (& result , Z_STR (retval )-> val , size );
627
+
628
+ /* Endianness safe */
629
+ char * ptr = (char * ) & result ;
630
+ for (i = 0 ; i < size ; i ++ ) {
631
+ ptr [i ] = Z_STR (retval )-> val [i ];
632
+ }
627
633
628
634
zval_ptr_dtor (& retval );
629
635
@@ -1163,7 +1169,12 @@ PHP_METHOD(Random_Engine_XorShift128Plus, __construct)
1163
1169
if (str_seed ) {
1164
1170
/* char (8 bit) * 16 = 128 bits */
1165
1171
if (str_seed -> len == 16 ) {
1166
- memcpy (state -> s , str_seed -> val , 16 );
1172
+ /* Endianness safe */
1173
+ int i ;
1174
+ char * ptr = (char * ) & state -> s ;
1175
+ for (i = 0 ; i < 16 ; i ++ ) {
1176
+ ptr [i ] = str_seed -> val [i ];
1177
+ }
1167
1178
} else {
1168
1179
zend_argument_value_error (1 , "state strings must be 16 bytes" );
1169
1180
RETURN_THROWS ();
@@ -1192,14 +1203,18 @@ PHP_METHOD(Random_Engine_XorShift128Plus, generate)
1192
1203
size_t size ;
1193
1204
uint64_t generated ;
1194
1205
zend_string * bytes ;
1206
+ int i ;
1195
1207
1196
1208
ZEND_PARSE_PARAMETERS_NONE ();
1197
1209
1198
1210
generated = engine -> algo -> generate (engine -> state );
1199
1211
size = engine -> algo -> size (engine -> state );
1200
1212
bytes = zend_string_alloc (size , 0 );
1201
1213
1202
- memcpy (ZSTR_VAL (bytes ), & generated , size );
1214
+ /* Endianness safe */
1215
+ for (i = 0 ; i < size ; i ++ ) {
1216
+ bytes -> val [i ] = (generated >> (i * 8 )) & 0xff ;
1217
+ }
1203
1218
1204
1219
ZSTR_VAL (bytes )[size ] = '\0' ;
1205
1220
@@ -1404,7 +1419,7 @@ PHP_METHOD(Random_Randomizer, getBytes)
1404
1419
zend_string * ret ;
1405
1420
zend_long length ;
1406
1421
uint64_t buf ;
1407
- uint8_t * bytes ;
1422
+ char * bytes ;
1408
1423
size_t generated_bytes = 0 ;
1409
1424
int i ;
1410
1425
@@ -1431,16 +1446,16 @@ PHP_METHOD(Random_Randomizer, getBytes)
1431
1446
generated_size += generate_size ;
1432
1447
}
1433
1448
1434
- bytes = (uint8_t * ) & buf ;
1435
- for (i = 0 ; i < (sizeof (uint64_t ) / sizeof (uint8_t )); i ++ ) {
1449
+ bytes = (char * ) & buf ;
1450
+ for (i = 0 ; i < (sizeof (uint64_t ) / sizeof (char )); i ++ ) {
1436
1451
ZSTR_VAL (ret )[generated_bytes + i ] = bytes [i ];
1437
1452
1438
1453
if ((generated_bytes + i ) >= length ) {
1439
1454
ZSTR_VAL (ret )[length ] = '\0' ;
1440
1455
RETURN_STR (ret );
1441
1456
}
1442
1457
}
1443
- generated_bytes += (sizeof (uint64_t ) / sizeof (uint8_t ));
1458
+ generated_bytes += (sizeof (uint64_t ) / sizeof (char ));
1444
1459
}
1445
1460
}
1446
1461
/* }}} */
0 commit comments