Skip to content

Commit b74c88d

Browse files
committed
fix endianness problem
1 parent 92fcec4 commit b74c88d

File tree

1 file changed

+22
-7
lines changed

1 file changed

+22
-7
lines changed

ext/random/random.c

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)