Skip to content

Use a single version of mempcpy(3) #12257

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Dec 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Zend/zend_operators.h
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,15 @@ static zend_always_inline size_t zend_strnlen(const char* s, size_t maxlen)
#endif
}

static zend_always_inline void *zend_mempcpy(void *dest, const void *src, size_t n)
{
#if defined(HAVE_MEMPCPY)
return mempcpy(dest, src, n);
#else
return (char *)memcpy(dest, src, n) + n;
#endif
}

ZEND_API zend_result ZEND_FASTCALL increment_function(zval *op1);
ZEND_API zend_result ZEND_FASTCALL decrement_function(zval *op2);

Expand Down
3 changes: 1 addition & 2 deletions Zend/zend_virtual_cwd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1681,8 +1681,7 @@ CWD_API FILE *virtual_popen(const char *command, const char *type) /* {{{ */
dir = CWDG(cwd).cwd;

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

if (CWDG(cwd).cwd_length == 0) {
*ptr++ = DEFAULT_SLASH;
Expand Down
1 change: 1 addition & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -644,6 +644,7 @@ asprintf \
nanosleep \
memmem \
memrchr \
mempcpy \
)

dnl Check for strerror_r, and if its a POSIX-compatible or a GNU specific version.
Expand Down
3 changes: 1 addition & 2 deletions ext/ffi/ffi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1495,8 +1495,7 @@ static bool zend_ffi_ctype_name_append(zend_ffi_ctype_name_buf *buf, const char
if (buf->end + len > buf->buf + MAX_TYPE_NAME_LEN) {
return 0;
}
memcpy(buf->end, str, len);
buf->end += len;
buf->end = zend_mempcpy(buf->end, str, len);
return 1;
}
/* }}} */
Expand Down
3 changes: 1 addition & 2 deletions ext/hash/hash_sha3.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,8 +190,7 @@ static void PHP_SHA3_Final(unsigned char* digest,
// Square output for digest
for(;;) {
int bs = (len < block_size) ? len : block_size;
memcpy(digest, ctx->state, bs);
digest += bs;
digest = zend_mempcpy(digest, ctx->state, bs);
len -= bs;
if (!len) break;
permute(ctx);
Expand Down
3 changes: 1 addition & 2 deletions ext/intl/converter/converter.c
Original file line number Diff line number Diff line change
Expand Up @@ -265,8 +265,7 @@ static void php_converter_append_fromUnicode_target(zval *val, UConverterFromUni
{
size_t vallen = Z_STRLEN_P(val);
if (TARGET_CHECK(args, vallen)) {
memcpy(args->target, Z_STRVAL_P(val), vallen);
args->target += vallen;
args->target = zend_mempcpy(args->target, Z_STRVAL_P(val), vallen);
}
return;
}
Expand Down
3 changes: 1 addition & 2 deletions ext/mbstring/mbstring.c
Original file line number Diff line number Diff line change
Expand Up @@ -2607,8 +2607,7 @@ static zend_string* mb_trim_string(zend_string *input, zend_string *marker, cons
append_trim_marker:
if (ZSTR_LEN(marker) > 0) {
MB_CONVERT_BUF_ENSURE((&buf), buf.out, buf.limit, ZSTR_LEN(marker));
memcpy(buf.out, ZSTR_VAL(marker), ZSTR_LEN(marker));
buf.out += ZSTR_LEN(marker);
buf.out = zend_mempcpy(buf.out, ZSTR_VAL(marker), ZSTR_LEN(marker));
}

/* Even if `enc` is UTF-8, don't mark the output string as valid UTF-8, because
Expand Down
21 changes: 7 additions & 14 deletions ext/mysqlnd/mysqlnd_wireprotocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -516,8 +516,7 @@ size_t php_mysqlnd_auth_write(MYSQLND_CONN_DATA * conn, void * _packet)

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

/* defensive coding */
Expand All @@ -540,15 +539,13 @@ size_t php_mysqlnd_auth_write(MYSQLND_CONN_DATA * conn, void * _packet)
DBG_RETURN(0);
}
if (packet->auth_data_len) {
memcpy(p, packet->auth_data, packet->auth_data_len);
p+= packet->auth_data_len;
p = zend_mempcpy(p, packet->auth_data, packet->auth_data_len);
}

if (packet->db_len > 0) {
/* CLIENT_CONNECT_WITH_DB should have been set */
size_t real_db_len = MIN(MYSQLND_MAX_ALLOWED_DB_LEN, packet->db_len);
memcpy(p, packet->db, real_db_len);
p+= real_db_len;
p = zend_mempcpy(p, packet->db, real_db_len);
*p++= '\0';
} else if (packet->is_change_user_packet) {
*p++= '\0';
Expand All @@ -564,8 +561,7 @@ size_t php_mysqlnd_auth_write(MYSQLND_CONN_DATA * conn, void * _packet)

if (packet->auth_plugin_name) {
len = MIN(strlen(packet->auth_plugin_name), sizeof(buffer) - (p - buffer) - 1);
memcpy(p, packet->auth_plugin_name, len);
p+= len;
p = zend_mempcpy(p, packet->auth_plugin_name, len);
*p++= '\0';
}

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

/* copy key */
p = php_mysqlnd_net_store_length(p, ZSTR_LEN(key));
memcpy(p, ZSTR_VAL(key), ZSTR_LEN(key));
p+= ZSTR_LEN(key);
p = zend_mempcpy(p, ZSTR_VAL(key), ZSTR_LEN(key));
/* copy value */
p = php_mysqlnd_net_store_length(p, value_len);
memcpy(p, Z_STRVAL_P(entry_value), value_len);
p+= value_len;
p = zend_mempcpy(p, Z_STRVAL_P(entry_value), value_len);
}
} ZEND_HASH_FOREACH_END();
}
Expand Down Expand Up @@ -766,8 +760,7 @@ php_mysqlnd_change_auth_response_write(MYSQLND_CONN_DATA * conn, void * _packet)
DBG_ENTER("php_mysqlnd_change_auth_response_write");

if (packet->auth_data_len) {
memcpy(p, packet->auth_data, packet->auth_data_len);
p+= packet->auth_data_len;
p = zend_mempcpy(p, packet->auth_data, packet->auth_data_len);
}

{
Expand Down
3 changes: 1 addition & 2 deletions ext/opcache/jit/zend_jit_helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -3150,8 +3150,7 @@ static zend_string* ZEND_FASTCALL zend_jit_rope_end(zend_string **rope, uint32_t

char *target = ZSTR_VAL(ret);
for (i = 0; i <= count; i++) {
memcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
target += ZSTR_LEN(rope[i]);
target = zend_mempcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
zend_string_release_ex(rope[i], 0);
}
*target = '\0';
Expand Down
6 changes: 2 additions & 4 deletions ext/opcache/shared_alloc_win32.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,11 @@ static char *create_name_with_username(char *name)
char *p = newname;
p += strlcpy(newname, name, MAXPATHLEN + 1);
*(p++) = '@';
memcpy(p, accel_uname_id, 32);
p += 32;
p = zend_mempcpy(p, accel_uname_id, 32);
*(p++) = '@';
p += strlcpy(p, sapi_module.name, 21);
*(p++) = '@';
memcpy(p, zend_system_id, 32);
p += 32;
p = zend_mempcpy(p, zend_system_id, 32);
*(p++) = '\0';
ZEND_ASSERT(p - newname <= sizeof(newname));

Expand Down
3 changes: 1 addition & 2 deletions ext/pcre/php_pcre.c
Original file line number Diff line number Diff line change
Expand Up @@ -1724,8 +1724,7 @@ PHPAPI zend_string *php_pcre_replace_impl(pcre_cache_entry *pce, zend_string *su
if (preg_get_backref(&walk, &backref)) {
if (backref < count) {
match_len = offsets[(backref<<1)+1] - offsets[backref<<1];
memcpy(walkbuf, subject + offsets[backref<<1], match_len);
walkbuf += match_len;
walkbuf = zend_mempcpy(walkbuf, subject + offsets[backref << 1], match_len);
}
continue;
}
Expand Down
9 changes: 2 additions & 7 deletions ext/standard/crypt_sha256.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,6 @@ char * __php_stpncpy(char *dst, const char *src, size_t len)
return strncpy(dst, src, len) + n;
}

void * __php_mempcpy(void * dst, const void * src, size_t len)
{
return (((char *)memcpy(dst, src, len)) + len);
}

#ifndef MIN
# define MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif
Expand Down Expand Up @@ -452,7 +447,7 @@ char * php_sha256_crypt_r(const char *key, const char *salt, char *buffer, int b
ALLOCA_FLAG(use_heap_p_bytes);
cp = p_bytes = do_alloca(key_len, use_heap_p_bytes);
for (cnt = key_len; cnt >= 32; cnt -= 32) {
cp = __php_mempcpy((void *)cp, (const void *)temp_result, 32);
cp = zend_mempcpy((void *)cp, (const void *)temp_result, 32);
}
memcpy(cp, temp_result, cnt);

Expand All @@ -471,7 +466,7 @@ char * php_sha256_crypt_r(const char *key, const char *salt, char *buffer, int b
ALLOCA_FLAG(use_heap_s_bytes);
cp = s_bytes = do_alloca(salt_len, use_heap_s_bytes);
for (cnt = salt_len; cnt >= 32; cnt -= 32) {
cp = __php_mempcpy(cp, temp_result, 32);
cp = zend_mempcpy(cp, temp_result, 32);
}
memcpy(cp, temp_result, cnt);

Expand Down
5 changes: 2 additions & 3 deletions ext/standard/crypt_sha512.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
# include <string.h>
#endif

extern void * __php_mempcpy(void * dst, const void * src, size_t len);
extern char * __php_stpncpy(char *dst, const char *src, size_t len);

#ifndef MIN
Expand Down Expand Up @@ -486,7 +485,7 @@ php_sha512_crypt_r(const char *key, const char *salt, char *buffer, int buflen)
ALLOCA_FLAG(use_heap_p_bytes);
cp = p_bytes = do_alloca(key_len, use_heap_p_bytes);
for (cnt = key_len; cnt >= 64; cnt -= 64) {
cp = __php_mempcpy((void *) cp, (const void *)temp_result, 64);
cp = zend_mempcpy((void *) cp, (const void *)temp_result, 64);
}

memcpy(cp, temp_result, cnt);
Expand All @@ -506,7 +505,7 @@ php_sha512_crypt_r(const char *key, const char *salt, char *buffer, int buflen)
ALLOCA_FLAG(use_heap_s_bytes);
cp = s_bytes = do_alloca(salt_len, use_heap_s_bytes);
for (cnt = salt_len; cnt >= 64; cnt -= 64) {
cp = __php_mempcpy(cp, temp_result, 64);
cp = zend_mempcpy(cp, temp_result, 64);
}
memcpy(cp, temp_result, cnt);

Expand Down
30 changes: 10 additions & 20 deletions ext/standard/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -1995,27 +1995,23 @@ PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure
case 0:
switch (state) {
case 2:
memcpy(tptr, hunk_begin, bptr - hunk_begin - 1);
tptr += (bptr - hunk_begin - 1);
tptr = zend_mempcpy(tptr, hunk_begin, (bptr - hunk_begin - 1));
hunk_begin = bptr;
goto quit_loop_2;

case 1:
memcpy(tptr, hunk_begin, bptr - hunk_begin);
tptr += (bptr - hunk_begin);
tptr = zend_mempcpy(tptr, hunk_begin, (bptr - hunk_begin));
hunk_begin = bptr;
ZEND_FALLTHROUGH;

case 0: {
if (hunk_begin != line_end) {
memcpy(tptr, hunk_begin, bptr - hunk_begin);
tptr += (bptr - hunk_begin);
tptr = zend_mempcpy(tptr, hunk_begin, (bptr - hunk_begin));
hunk_begin = bptr;
}

/* add the embedded line end to the field */
memcpy(tptr, line_end, line_end_len);
tptr += line_end_len;
tptr = zend_mempcpy(tptr, line_end, line_end_len);

/* nothing can be fetched if stream is NULL (e.g. str_getcsv()) */
if (stream == NULL) {
Expand Down Expand Up @@ -2082,13 +2078,11 @@ PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure
case 2: /* embedded enclosure ? let's check it */
if (*bptr != enclosure) {
/* real enclosure */
memcpy(tptr, hunk_begin, bptr - hunk_begin - 1);
tptr += (bptr - hunk_begin - 1);
tptr = zend_mempcpy(tptr, hunk_begin, bptr - hunk_begin - 1);
hunk_begin = bptr;
goto quit_loop_2;
}
memcpy(tptr, hunk_begin, bptr - hunk_begin);
tptr += (bptr - hunk_begin);
tptr = zend_mempcpy(tptr, hunk_begin, bptr - hunk_begin);
bptr++;
hunk_begin = bptr;
state = 0;
Expand All @@ -2108,14 +2102,12 @@ PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure
switch (state) {
case 2:
/* real enclosure */
memcpy(tptr, hunk_begin, bptr - hunk_begin - 1);
tptr += (bptr - hunk_begin - 1);
tptr = zend_mempcpy(tptr, hunk_begin, bptr - hunk_begin - 1);
hunk_begin = bptr;
goto quit_loop_2;
case 1:
bptr += inc_len;
memcpy(tptr, hunk_begin, bptr - hunk_begin);
tptr += (bptr - hunk_begin);
tptr = zend_mempcpy(tptr, hunk_begin, bptr - hunk_begin);
hunk_begin = bptr;
state = 0;
break;
Expand Down Expand Up @@ -2153,8 +2145,7 @@ PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure
}

quit_loop_3:
memcpy(tptr, hunk_begin, bptr - hunk_begin);
tptr += (bptr - hunk_begin);
tptr = zend_mempcpy(tptr, hunk_begin, bptr - hunk_begin);
bptr += inc_len;
comp_end = tptr;
} else {
Expand Down Expand Up @@ -2183,8 +2174,7 @@ PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure
inc_len = (bptr < limit ? (*bptr == '\0' ? 1 : php_mblen(bptr, limit - bptr)): 0);
}
quit_loop_4:
memcpy(tptr, hunk_begin, bptr - hunk_begin);
tptr += (bptr - hunk_begin);
tptr = zend_mempcpy(tptr, hunk_begin, bptr - hunk_begin);

comp_end = (char *)php_fgetcsv_lookup_trailing_spaces(temp, tptr - temp);
if (*bptr == delimiter) {
Expand Down
21 changes: 7 additions & 14 deletions ext/standard/filters.c
Original file line number Diff line number Diff line change
Expand Up @@ -297,8 +297,7 @@ static php_conv_err_t php_conv_base64_encode_flush(php_conv_base64_encode *inst,
if (ocnt < inst->lbchars_len) {
return PHP_CONV_ERR_TOO_BIG;
}
memcpy(pd, inst->lbchars, inst->lbchars_len);
pd += inst->lbchars_len;
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
ocnt -= inst->lbchars_len;
line_ccnt = inst->line_len;
}
Expand Down Expand Up @@ -352,8 +351,7 @@ static php_conv_err_t php_conv_base64_encode_convert(php_conv_base64_encode *ins
if (ocnt < inst->lbchars_len) {
return PHP_CONV_ERR_TOO_BIG;
}
memcpy(pd, inst->lbchars, inst->lbchars_len);
pd += inst->lbchars_len;
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
ocnt -= inst->lbchars_len;
line_ccnt = inst->line_len;
}
Expand All @@ -379,8 +377,7 @@ static php_conv_err_t php_conv_base64_encode_convert(php_conv_base64_encode *ins
if (ocnt < inst->lbchars_len) {
return PHP_CONV_ERR_TOO_BIG;
}
memcpy(pd, inst->lbchars, inst->lbchars_len);
pd += inst->lbchars_len;
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
ocnt -= inst->lbchars_len;
line_ccnt = inst->line_len;
}
Expand All @@ -407,8 +404,7 @@ static php_conv_err_t php_conv_base64_encode_convert(php_conv_base64_encode *ins
err = PHP_CONV_ERR_TOO_BIG;
goto out;
}
memcpy(pd, inst->lbchars, inst->lbchars_len);
pd += inst->lbchars_len;
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
ocnt -= inst->lbchars_len;
line_ccnt = inst->line_len;
}
Expand Down Expand Up @@ -721,8 +717,7 @@ static php_conv_err_t php_conv_qprint_encode_convert(php_conv_qprint_encode *ins
ocnt--;
line_ccnt--;

memcpy(pd, inst->lbchars, inst->lbchars_len);
pd += inst->lbchars_len;
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
ocnt -= inst->lbchars_len;
line_ccnt = inst->line_len;
} else {
Expand Down Expand Up @@ -778,8 +773,7 @@ static php_conv_err_t php_conv_qprint_encode_convert(php_conv_qprint_encode *ins
ocnt--;
line_ccnt--;

memcpy(pd, inst->lbchars, inst->lbchars_len);
pd += inst->lbchars_len;
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
ocnt -= inst->lbchars_len;
line_ccnt = inst->line_len;
}
Expand All @@ -801,8 +795,7 @@ static php_conv_err_t php_conv_qprint_encode_convert(php_conv_qprint_encode *ins
ocnt--;
line_ccnt--;

memcpy(pd, inst->lbchars, inst->lbchars_len);
pd += inst->lbchars_len;
pd = zend_mempcpy(pd, inst->lbchars, inst->lbchars_len);
ocnt -= inst->lbchars_len;
line_ccnt = inst->line_len;
}
Expand Down
6 changes: 2 additions & 4 deletions ext/standard/proc_open.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,13 +203,11 @@ static php_process_env _php_array_to_envp(zval *environment)
#endif

if (key) {
memcpy(p, ZSTR_VAL(key), ZSTR_LEN(key));
p += ZSTR_LEN(key);
p = zend_mempcpy(p, ZSTR_VAL(key), ZSTR_LEN(key));
*p++ = '=';
}

memcpy(p, ZSTR_VAL(str), ZSTR_LEN(str));
p += ZSTR_LEN(str);
p = zend_mempcpy(p, ZSTR_VAL(str), ZSTR_LEN(str));
*p++ = '\0';
zend_string_release_ex(str, 0);
} ZEND_HASH_FOREACH_END();
Expand Down
Loading