Skip to content

Commit 927adfb

Browse files
authored
Use a single version of mempcpy(3) (#12257)
While __php_mempcpy is only used by ext/standard/crypt_sha*, the mempcpy "pattern" is used everywhere. This commit removes __php_mempcpy, adds zend_mempcpy and transforms open-coded parts into function calls.
1 parent 1fc85a3 commit 927adfb

File tree

22 files changed

+96
-175
lines changed

22 files changed

+96
-175
lines changed

Zend/zend_operators.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,15 @@ static zend_always_inline size_t zend_strnlen(const char* s, size_t maxlen)
274274
#endif
275275
}
276276

277+
static zend_always_inline void *zend_mempcpy(void *dest, const void *src, size_t n)
278+
{
279+
#if defined(HAVE_MEMPCPY)
280+
return mempcpy(dest, src, n);
281+
#else
282+
return (char *)memcpy(dest, src, n) + n;
283+
#endif
284+
}
285+
277286
ZEND_API zend_result ZEND_FASTCALL increment_function(zval *op1);
278287
ZEND_API zend_result ZEND_FASTCALL decrement_function(zval *op2);
279288

Zend/zend_virtual_cwd.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1681,8 +1681,7 @@ CWD_API FILE *virtual_popen(const char *command, const char *type) /* {{{ */
16811681
dir = CWDG(cwd).cwd;
16821682

16831683
ptr = command_line = (char *) emalloc(command_length + sizeof("cd '' ; ") + dir_length + extra+1+1);
1684-
memcpy(ptr, "cd ", sizeof("cd ")-1);
1685-
ptr += sizeof("cd ")-1;
1684+
ptr = zend_mempcpy(ptr, "cd ", sizeof("cd ") - 1);
16861685

16871686
if (CWDG(cwd).cwd_length == 0) {
16881687
*ptr++ = DEFAULT_SLASH;

configure.ac

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,7 @@ asprintf \
640640
nanosleep \
641641
memmem \
642642
memrchr \
643+
mempcpy \
643644
)
644645

645646
AC_CHECK_FUNCS(inet_ntop,[],[

ext/ffi/ffi.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,8 +1501,7 @@ static bool zend_ffi_ctype_name_append(zend_ffi_ctype_name_buf *buf, const char
15011501
if (buf->end + len > buf->buf + MAX_TYPE_NAME_LEN) {
15021502
return 0;
15031503
}
1504-
memcpy(buf->end, str, len);
1505-
buf->end += len;
1504+
buf->end = zend_mempcpy(buf->end, str, len);
15061505
return 1;
15071506
}
15081507
/* }}} */

ext/hash/hash_sha3.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,7 @@ static void PHP_SHA3_Final(unsigned char* digest,
190190
// Square output for digest
191191
for(;;) {
192192
int bs = (len < block_size) ? len : block_size;
193-
memcpy(digest, ctx->state, bs);
194-
digest += bs;
193+
digest = zend_mempcpy(digest, ctx->state, bs);
195194
len -= bs;
196195
if (!len) break;
197196
permute(ctx);

ext/intl/converter/converter.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,7 @@ static void php_converter_append_fromUnicode_target(zval *val, UConverterFromUni
265265
{
266266
size_t vallen = Z_STRLEN_P(val);
267267
if (TARGET_CHECK(args, vallen)) {
268-
memcpy(args->target, Z_STRVAL_P(val), vallen);
269-
args->target += vallen;
268+
args->target = zend_mempcpy(args->target, Z_STRVAL_P(val), vallen);
270269
}
271270
return;
272271
}

ext/mbstring/mbstring.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2621,8 +2621,7 @@ static zend_string* mb_trim_string(zend_string *input, zend_string *marker, cons
26212621
append_trim_marker:
26222622
if (ZSTR_LEN(marker) > 0) {
26232623
MB_CONVERT_BUF_ENSURE((&buf), buf.out, buf.limit, ZSTR_LEN(marker));
2624-
memcpy(buf.out, ZSTR_VAL(marker), ZSTR_LEN(marker));
2625-
buf.out += ZSTR_LEN(marker);
2624+
buf.out = zend_mempcpy(buf.out, ZSTR_VAL(marker), ZSTR_LEN(marker));
26262625
}
26272626

26282627
/* Even if `enc` is UTF-8, don't mark the output string as valid UTF-8, because

ext/mysqlnd/mysqlnd_wireprotocol.c

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -516,8 +516,7 @@ size_t php_mysqlnd_auth_write(MYSQLND_CONN_DATA * conn, void * _packet)
516516

517517
if (packet->send_auth_data || packet->is_change_user_packet) {
518518
len = MIN(strlen(packet->user), MYSQLND_MAX_ALLOWED_USER_LEN);
519-
memcpy(p, packet->user, len);
520-
p+= len;
519+
p = zend_mempcpy(p, packet->user, len);
521520
*p++ = '\0';
522521

523522
/* defensive coding */
@@ -540,15 +539,13 @@ size_t php_mysqlnd_auth_write(MYSQLND_CONN_DATA * conn, void * _packet)
540539
DBG_RETURN(0);
541540
}
542541
if (packet->auth_data_len) {
543-
memcpy(p, packet->auth_data, packet->auth_data_len);
544-
p+= packet->auth_data_len;
542+
p = zend_mempcpy(p, packet->auth_data, packet->auth_data_len);
545543
}
546544

547545
if (packet->db_len > 0) {
548546
/* CLIENT_CONNECT_WITH_DB should have been set */
549547
size_t real_db_len = MIN(MYSQLND_MAX_ALLOWED_DB_LEN, packet->db_len);
550-
memcpy(p, packet->db, real_db_len);
551-
p+= real_db_len;
548+
p = zend_mempcpy(p, packet->db, real_db_len);
552549
*p++= '\0';
553550
} else if (packet->is_change_user_packet) {
554551
*p++= '\0';
@@ -564,8 +561,7 @@ size_t php_mysqlnd_auth_write(MYSQLND_CONN_DATA * conn, void * _packet)
564561

565562
if (packet->auth_plugin_name) {
566563
len = MIN(strlen(packet->auth_plugin_name), sizeof(buffer) - (p - buffer) - 1);
567-
memcpy(p, packet->auth_plugin_name, len);
568-
p+= len;
564+
p = zend_mempcpy(p, packet->auth_plugin_name, len);
569565
*p++= '\0';
570566
}
571567

@@ -599,12 +595,10 @@ size_t php_mysqlnd_auth_write(MYSQLND_CONN_DATA * conn, void * _packet)
599595

600596
/* copy key */
601597
p = php_mysqlnd_net_store_length(p, ZSTR_LEN(key));
602-
memcpy(p, ZSTR_VAL(key), ZSTR_LEN(key));
603-
p+= ZSTR_LEN(key);
598+
p = zend_mempcpy(p, ZSTR_VAL(key), ZSTR_LEN(key));
604599
/* copy value */
605600
p = php_mysqlnd_net_store_length(p, value_len);
606-
memcpy(p, Z_STRVAL_P(entry_value), value_len);
607-
p+= value_len;
601+
p = zend_mempcpy(p, Z_STRVAL_P(entry_value), value_len);
608602
}
609603
} ZEND_HASH_FOREACH_END();
610604
}
@@ -766,8 +760,7 @@ php_mysqlnd_change_auth_response_write(MYSQLND_CONN_DATA * conn, void * _packet)
766760
DBG_ENTER("php_mysqlnd_change_auth_response_write");
767761

768762
if (packet->auth_data_len) {
769-
memcpy(p, packet->auth_data, packet->auth_data_len);
770-
p+= packet->auth_data_len;
763+
p = zend_mempcpy(p, packet->auth_data, packet->auth_data_len);
771764
}
772765

773766
{

ext/opcache/jit/zend_jit_helpers.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3160,8 +3160,7 @@ static zend_string* ZEND_FASTCALL zend_jit_rope_end(zend_string **rope, uint32_t
31603160

31613161
char *target = ZSTR_VAL(ret);
31623162
for (i = 0; i <= count; i++) {
3163-
memcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
3164-
target += ZSTR_LEN(rope[i]);
3163+
target = zend_mempcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
31653164
zend_string_release_ex(rope[i], 0);
31663165
}
31673166
*target = '\0';

ext/opcache/shared_alloc_win32.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,11 @@ static char *create_name_with_username(char *name)
7575
char *p = newname;
7676
p += strlcpy(newname, name, MAXPATHLEN + 1);
7777
*(p++) = '@';
78-
memcpy(p, accel_uname_id, 32);
79-
p += 32;
78+
p = zend_mempcpy(p, accel_uname_id, 32);
8079
*(p++) = '@';
8180
p += strlcpy(p, sapi_module.name, 21);
8281
*(p++) = '@';
83-
memcpy(p, zend_system_id, 32);
84-
p += 32;
82+
p = zend_mempcpy(p, zend_system_id, 32);
8583
*(p++) = '\0';
8684
ZEND_ASSERT(p - newname <= sizeof(newname));
8785

ext/pcre/php_pcre.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1718,8 +1718,7 @@ PHPAPI zend_string *php_pcre_replace_impl(pcre_cache_entry *pce, zend_string *su
17181718
if (preg_get_backref(&walk, &backref)) {
17191719
if (backref < count) {
17201720
match_len = offsets[(backref<<1)+1] - offsets[backref<<1];
1721-
memcpy(walkbuf, subject + offsets[backref<<1], match_len);
1722-
walkbuf += match_len;
1721+
walkbuf = zend_mempcpy(walkbuf, subject + offsets[backref << 1], match_len);
17231722
}
17241723
continue;
17251724
}

ext/standard/crypt_sha256.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,6 @@ char * __php_stpncpy(char *dst, const char *src, size_t len)
3737
return strncpy(dst, src, len) + n;
3838
}
3939

40-
void * __php_mempcpy(void * dst, const void * src, size_t len)
41-
{
42-
return (((char *)memcpy(dst, src, len)) + len);
43-
}
44-
4540
#ifndef MIN
4641
# define MIN(a, b) (((a) < (b)) ? (a) : (b))
4742
#endif
@@ -452,7 +447,7 @@ char * php_sha256_crypt_r(const char *key, const char *salt, char *buffer, int b
452447
ALLOCA_FLAG(use_heap_p_bytes);
453448
cp = p_bytes = do_alloca(key_len, use_heap_p_bytes);
454449
for (cnt = key_len; cnt >= 32; cnt -= 32) {
455-
cp = __php_mempcpy((void *)cp, (const void *)temp_result, 32);
450+
cp = zend_mempcpy((void *)cp, (const void *)temp_result, 32);
456451
}
457452
memcpy(cp, temp_result, cnt);
458453

@@ -471,7 +466,7 @@ char * php_sha256_crypt_r(const char *key, const char *salt, char *buffer, int b
471466
ALLOCA_FLAG(use_heap_s_bytes);
472467
cp = s_bytes = do_alloca(salt_len, use_heap_s_bytes);
473468
for (cnt = salt_len; cnt >= 32; cnt -= 32) {
474-
cp = __php_mempcpy(cp, temp_result, 32);
469+
cp = zend_mempcpy(cp, temp_result, 32);
475470
}
476471
memcpy(cp, temp_result, cnt);
477472

ext/standard/crypt_sha512.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
# include <string.h>
2828
#endif
2929

30-
extern void * __php_mempcpy(void * dst, const void * src, size_t len);
3130
extern char * __php_stpncpy(char *dst, const char *src, size_t len);
3231

3332
#ifndef MIN
@@ -486,7 +485,7 @@ php_sha512_crypt_r(const char *key, const char *salt, char *buffer, int buflen)
486485
ALLOCA_FLAG(use_heap_p_bytes);
487486
cp = p_bytes = do_alloca(key_len, use_heap_p_bytes);
488487
for (cnt = key_len; cnt >= 64; cnt -= 64) {
489-
cp = __php_mempcpy((void *) cp, (const void *)temp_result, 64);
488+
cp = zend_mempcpy((void *) cp, (const void *)temp_result, 64);
490489
}
491490

492491
memcpy(cp, temp_result, cnt);
@@ -506,7 +505,7 @@ php_sha512_crypt_r(const char *key, const char *salt, char *buffer, int buflen)
506505
ALLOCA_FLAG(use_heap_s_bytes);
507506
cp = s_bytes = do_alloca(salt_len, use_heap_s_bytes);
508507
for (cnt = salt_len; cnt >= 64; cnt -= 64) {
509-
cp = __php_mempcpy(cp, temp_result, 64);
508+
cp = zend_mempcpy(cp, temp_result, 64);
510509
}
511510
memcpy(cp, temp_result, cnt);
512511

ext/standard/file.c

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1993,27 +1993,23 @@ PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure
19931993
case 0:
19941994
switch (state) {
19951995
case 2:
1996-
memcpy(tptr, hunk_begin, bptr - hunk_begin - 1);
1997-
tptr += (bptr - hunk_begin - 1);
1996+
tptr = zend_mempcpy(tptr, hunk_begin, (bptr - hunk_begin - 1));
19981997
hunk_begin = bptr;
19991998
goto quit_loop_2;
20001999

20012000
case 1:
2002-
memcpy(tptr, hunk_begin, bptr - hunk_begin);
2003-
tptr += (bptr - hunk_begin);
2001+
tptr = zend_mempcpy(tptr, hunk_begin, (bptr - hunk_begin));
20042002
hunk_begin = bptr;
20052003
ZEND_FALLTHROUGH;
20062004

20072005
case 0: {
20082006
if (hunk_begin != line_end) {
2009-
memcpy(tptr, hunk_begin, bptr - hunk_begin);
2010-
tptr += (bptr - hunk_begin);
2007+
tptr = zend_mempcpy(tptr, hunk_begin, (bptr - hunk_begin));
20112008
hunk_begin = bptr;
20122009
}
20132010

20142011
/* add the embedded line end to the field */
2015-
memcpy(tptr, line_end, line_end_len);
2016-
tptr += line_end_len;
2012+
tptr = zend_mempcpy(tptr, line_end, line_end_len);
20172013

20182014
/* nothing can be fetched if stream is NULL (e.g. str_getcsv()) */
20192015
if (stream == NULL) {
@@ -2080,13 +2076,11 @@ PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure
20802076
case 2: /* embedded enclosure ? let's check it */
20812077
if (*bptr != enclosure) {
20822078
/* real enclosure */
2083-
memcpy(tptr, hunk_begin, bptr - hunk_begin - 1);
2084-
tptr += (bptr - hunk_begin - 1);
2079+
tptr = zend_mempcpy(tptr, hunk_begin, bptr - hunk_begin - 1);
20852080
hunk_begin = bptr;
20862081
goto quit_loop_2;
20872082
}
2088-
memcpy(tptr, hunk_begin, bptr - hunk_begin);
2089-
tptr += (bptr - hunk_begin);
2083+
tptr = zend_mempcpy(tptr, hunk_begin, bptr - hunk_begin);
20902084
bptr++;
20912085
hunk_begin = bptr;
20922086
state = 0;
@@ -2106,14 +2100,12 @@ PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure
21062100
switch (state) {
21072101
case 2:
21082102
/* real enclosure */
2109-
memcpy(tptr, hunk_begin, bptr - hunk_begin - 1);
2110-
tptr += (bptr - hunk_begin - 1);
2103+
tptr = zend_mempcpy(tptr, hunk_begin, bptr - hunk_begin - 1);
21112104
hunk_begin = bptr;
21122105
goto quit_loop_2;
21132106
case 1:
21142107
bptr += inc_len;
2115-
memcpy(tptr, hunk_begin, bptr - hunk_begin);
2116-
tptr += (bptr - hunk_begin);
2108+
tptr = zend_mempcpy(tptr, hunk_begin, bptr - hunk_begin);
21172109
hunk_begin = bptr;
21182110
state = 0;
21192111
break;
@@ -2151,8 +2143,7 @@ PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure
21512143
}
21522144

21532145
quit_loop_3:
2154-
memcpy(tptr, hunk_begin, bptr - hunk_begin);
2155-
tptr += (bptr - hunk_begin);
2146+
tptr = zend_mempcpy(tptr, hunk_begin, bptr - hunk_begin);
21562147
bptr += inc_len;
21572148
comp_end = tptr;
21582149
} else {
@@ -2181,8 +2172,7 @@ PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure
21812172
inc_len = (bptr < limit ? (*bptr == '\0' ? 1 : php_mblen(bptr, limit - bptr)): 0);
21822173
}
21832174
quit_loop_4:
2184-
memcpy(tptr, hunk_begin, bptr - hunk_begin);
2185-
tptr += (bptr - hunk_begin);
2175+
tptr = zend_mempcpy(tptr, hunk_begin, bptr - hunk_begin);
21862176

21872177
comp_end = (char *)php_fgetcsv_lookup_trailing_spaces(temp, tptr - temp);
21882178
if (*bptr == delimiter) {

ext/standard/filters.c

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -297,8 +297,7 @@ static php_conv_err_t php_conv_base64_encode_flush(php_conv_base64_encode *inst,
297297
if (ocnt < inst->lbchars_len) {
298298
return PHP_CONV_ERR_TOO_BIG;
299299
}
300-
memcpy(pd, inst->lbchars, inst->lbchars_len);
301-
pd += inst->lbchars_len;
300+
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
302301
ocnt -= inst->lbchars_len;
303302
line_ccnt = inst->line_len;
304303
}
@@ -352,8 +351,7 @@ static php_conv_err_t php_conv_base64_encode_convert(php_conv_base64_encode *ins
352351
if (ocnt < inst->lbchars_len) {
353352
return PHP_CONV_ERR_TOO_BIG;
354353
}
355-
memcpy(pd, inst->lbchars, inst->lbchars_len);
356-
pd += inst->lbchars_len;
354+
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
357355
ocnt -= inst->lbchars_len;
358356
line_ccnt = inst->line_len;
359357
}
@@ -379,8 +377,7 @@ static php_conv_err_t php_conv_base64_encode_convert(php_conv_base64_encode *ins
379377
if (ocnt < inst->lbchars_len) {
380378
return PHP_CONV_ERR_TOO_BIG;
381379
}
382-
memcpy(pd, inst->lbchars, inst->lbchars_len);
383-
pd += inst->lbchars_len;
380+
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
384381
ocnt -= inst->lbchars_len;
385382
line_ccnt = inst->line_len;
386383
}
@@ -407,8 +404,7 @@ static php_conv_err_t php_conv_base64_encode_convert(php_conv_base64_encode *ins
407404
err = PHP_CONV_ERR_TOO_BIG;
408405
goto out;
409406
}
410-
memcpy(pd, inst->lbchars, inst->lbchars_len);
411-
pd += inst->lbchars_len;
407+
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
412408
ocnt -= inst->lbchars_len;
413409
line_ccnt = inst->line_len;
414410
}
@@ -721,8 +717,7 @@ static php_conv_err_t php_conv_qprint_encode_convert(php_conv_qprint_encode *ins
721717
ocnt--;
722718
line_ccnt--;
723719

724-
memcpy(pd, inst->lbchars, inst->lbchars_len);
725-
pd += inst->lbchars_len;
720+
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
726721
ocnt -= inst->lbchars_len;
727722
line_ccnt = inst->line_len;
728723
} else {
@@ -778,8 +773,7 @@ static php_conv_err_t php_conv_qprint_encode_convert(php_conv_qprint_encode *ins
778773
ocnt--;
779774
line_ccnt--;
780775

781-
memcpy(pd, inst->lbchars, inst->lbchars_len);
782-
pd += inst->lbchars_len;
776+
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
783777
ocnt -= inst->lbchars_len;
784778
line_ccnt = inst->line_len;
785779
}
@@ -801,8 +795,7 @@ static php_conv_err_t php_conv_qprint_encode_convert(php_conv_qprint_encode *ins
801795
ocnt--;
802796
line_ccnt--;
803797

804-
memcpy(pd, inst->lbchars, inst->lbchars_len);
805-
pd += inst->lbchars_len;
798+
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
806799
ocnt -= inst->lbchars_len;
807800
line_ccnt = inst->line_len;
808801
}

ext/standard/proc_open.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,11 @@ static php_process_env _php_array_to_envp(zval *environment)
203203
#endif
204204

205205
if (key) {
206-
memcpy(p, ZSTR_VAL(key), ZSTR_LEN(key));
207-
p += ZSTR_LEN(key);
206+
p = zend_mempcpy(p, ZSTR_VAL(key), ZSTR_LEN(key));
208207
*p++ = '=';
209208
}
210209

211-
memcpy(p, ZSTR_VAL(str), ZSTR_LEN(str));
212-
p += ZSTR_LEN(str);
210+
p = zend_mempcpy(p, ZSTR_VAL(str), ZSTR_LEN(str));
213211
*p++ = '\0';
214212
zend_string_release_ex(str, 0);
215213
} ZEND_HASH_FOREACH_END();

0 commit comments

Comments
 (0)