Skip to content

Commit eeb40d3

Browse files
committed
Changed to use memcpy when possible
1 parent 5c728d9 commit eeb40d3

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

ext/random/randomizer.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ PHP_METHOD(Random_Randomizer, getBytes)
291291

292292
size_t length = (size_t)user_length;
293293
retval = zend_string_alloc(length, 0);
294+
char *rptr = ZSTR_VAL(retval);
294295

295296
while (total_size < length) {
296297
php_random_result result = engine.algo->generate(engine.state);
@@ -299,16 +300,25 @@ PHP_METHOD(Random_Randomizer, getBytes)
299300
RETURN_THROWS();
300301
}
301302
uint64_t tmp_ret = result.result;
302-
for (size_t i = 0; i < result.size; i++) {
303-
ZSTR_VAL(retval)[total_size++] = tmp_ret & 0xff;
304-
tmp_ret >>= 8;
305-
if (total_size >= length) {
306-
break;
303+
if (length - total_size >= sizeof(uint64_t) && result.size == sizeof(uint64_t)) {
304+
#ifdef WORDS_BIGENDIAN
305+
tmp_ret = RANDOM_BSWAP64(tmp_ret);
306+
#endif
307+
memcpy(rptr, &tmp_ret, sizeof(uint64_t));
308+
total_size += sizeof(uint64_t);
309+
rptr += sizeof(uint64_t);
310+
} else {
311+
for (size_t i = 0; i < result.size; i++) {
312+
rptr[total_size++] = tmp_ret & 0xff;
313+
tmp_ret >>= 8;
314+
if (total_size >= length) {
315+
break;
316+
}
307317
}
308318
}
309319
}
310320

311-
ZSTR_VAL(retval)[length] = '\0';
321+
rptr[length] = '\0';
312322
RETURN_STR(retval);
313323
}
314324
/* }}} */

0 commit comments

Comments
 (0)