@@ -615,6 +615,7 @@ static uint64_t user_generate(void *state) {
615615 uint64_t result = 0 ;
616616 size_t size ;
617617 zval retval ;
618+ int i ;
618619
619620 zend_call_known_instance_method_with_0_params (s -> generate_method , s -> object , & retval );
620621
@@ -623,7 +624,12 @@ static uint64_t user_generate(void *state) {
623624 if (size > sizeof (uint64_t )) {
624625 size = sizeof (uint64_t );
625626 }
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+ }
627633
628634 zval_ptr_dtor (& retval );
629635
@@ -1163,7 +1169,12 @@ PHP_METHOD(Random_Engine_XorShift128Plus, __construct)
11631169 if (str_seed ) {
11641170 /* char (8 bit) * 16 = 128 bits */
11651171 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+ }
11671178 } else {
11681179 zend_argument_value_error (1 , "state strings must be 16 bytes" );
11691180 RETURN_THROWS ();
@@ -1192,14 +1203,18 @@ PHP_METHOD(Random_Engine_XorShift128Plus, generate)
11921203 size_t size ;
11931204 uint64_t generated ;
11941205 zend_string * bytes ;
1206+ int i ;
11951207
11961208 ZEND_PARSE_PARAMETERS_NONE ();
11971209
11981210 generated = engine -> algo -> generate (engine -> state );
11991211 size = engine -> algo -> size (engine -> state );
12001212 bytes = zend_string_alloc (size , 0 );
12011213
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+ }
12031218
12041219 ZSTR_VAL (bytes )[size ] = '\0' ;
12051220
@@ -1404,7 +1419,7 @@ PHP_METHOD(Random_Randomizer, getBytes)
14041419 zend_string * ret ;
14051420 zend_long length ;
14061421 uint64_t buf ;
1407- uint8_t * bytes ;
1422+ char * bytes ;
14081423 size_t generated_bytes = 0 ;
14091424 int i ;
14101425
@@ -1431,16 +1446,16 @@ PHP_METHOD(Random_Randomizer, getBytes)
14311446 generated_size += generate_size ;
14321447 }
14331448
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 ++ ) {
14361451 ZSTR_VAL (ret )[generated_bytes + i ] = bytes [i ];
14371452
14381453 if ((generated_bytes + i ) >= length ) {
14391454 ZSTR_VAL (ret )[length ] = '\0' ;
14401455 RETURN_STR (ret );
14411456 }
14421457 }
1443- generated_bytes += (sizeof (uint64_t ) / sizeof (uint8_t ));
1458+ generated_bytes += (sizeof (uint64_t ) / sizeof (char ));
14441459 }
14451460}
14461461/* }}} */
0 commit comments