1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

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.
This commit is contained in:
Cristian Rodríguez
2023-12-20 12:16:32 -03:00
committed by GitHub
parent 1fc85a30b3
commit 927adfb1a6
22 changed files with 96 additions and 175 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -640,6 +640,7 @@ asprintf \
nanosleep \
memmem \
memrchr \
mempcpy \
)
AC_CHECK_FUNCS(inet_ntop,[],[

View File

@@ -1501,8 +1501,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;
}
/* }}} */

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -2621,8 +2621,7 @@ dont_restart_conversion:
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

View File

@@ -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 */
@@ -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';
@@ -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';
}
@@ -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();
}
@@ -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);
}
{

View File

@@ -3160,8 +3160,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';

View File

@@ -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));

View File

@@ -1718,8 +1718,7 @@ matched:
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;
}

View File

@@ -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
@@ -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);
@@ -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);

View File

@@ -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
@@ -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);
@@ -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);

View File

@@ -1993,27 +1993,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) {
@@ -2080,13 +2076,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;
@@ -2106,14 +2100,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;
@@ -2151,8 +2143,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 {
@@ -2181,8 +2172,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) {

View File

@@ -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;
}
@@ -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;
}
@@ -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;
}
@@ -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;
}
@@ -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 {
@@ -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;
}
@@ -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;
}

View File

@@ -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();

View File

@@ -1993,18 +1993,14 @@ static zend_string *php_chunk_split(const char *src, size_t srclen, const char *
dest = zend_string_safe_alloc(chunks, endlen, srclen, 0);
for (p = src, q = ZSTR_VAL(dest); p < (src + srclen - chunklen + 1); ) {
memcpy(q, p, chunklen);
q += chunklen;
memcpy(q, end, endlen);
q += endlen;
q = zend_mempcpy(q, p, chunklen);
q = zend_mempcpy(q, end, endlen);
p += chunklen;
}
if (restlen) {
memcpy(q, p, restlen);
q += restlen;
memcpy(q, end, endlen);
q += endlen;
q = zend_mempcpy(q, p, restlen);
q = zend_mempcpy(q, end, endlen);
}
*q = '\0';
@@ -2921,24 +2917,20 @@ static zend_string* php_char_to_str_ex(zend_string *str, char from, char *to, si
char *p = ZSTR_VAL(str), *e = p + ZSTR_LEN(str), *s = ZSTR_VAL(str);
while ((p = memchr(p, from, (e - p)))) {
memcpy(target, s, (p - s));
target += p - s;
memcpy(target, to, to_len);
target += to_len;
target = zend_mempcpy(target, s, (p - s));
target = zend_mempcpy(target, to, to_len);
p++;
s = p;
if (--char_count == 0) break;
}
if (s < e) {
memcpy(target, s, (e - s));
target += e - s;
target = zend_mempcpy(target, s, e - s);
}
} else {
source_end = ZSTR_VAL(str) + ZSTR_LEN(str);
for (source = ZSTR_VAL(str); source < source_end; source++) {
if (zend_tolower_ascii(*source) == lc_from) {
memcpy(target, to, to_len);
target += to_len;
target = zend_mempcpy(target, to, to_len);
} else {
*target = *source;
target++;
@@ -2998,16 +2990,13 @@ static zend_string *php_str_to_str_ex(zend_string *haystack,
e = ZSTR_VAL(new_str);
end = ZSTR_VAL(haystack) + ZSTR_LEN(haystack);
for (p = ZSTR_VAL(haystack); (r = (char*)php_memnstr(p, needle, needle_len, end)); p = r + needle_len) {
memcpy(e, p, r - p);
e += r - p;
memcpy(e, str, str_len);
e += str_len;
e = zend_mempcpy(e, p, r - p);
e = zend_mempcpy(e, str, str_len);
(*replace_count)++;
}
if (p < end) {
memcpy(e, p, end - p);
e += end - p;
e = zend_mempcpy(e, p, end - p);
}
*e = '\0';
@@ -3080,16 +3069,13 @@ static zend_string *php_str_to_str_i_ex(zend_string *haystack, const char *lc_ha
end = lc_haystack + ZSTR_LEN(haystack);
for (p = lc_haystack; (r = (char*)php_memnstr(p, ZSTR_VAL(lc_needle), ZSTR_LEN(lc_needle), end)); p = r + ZSTR_LEN(lc_needle)) {
memcpy(e, ZSTR_VAL(haystack) + (p - lc_haystack), r - p);
e += r - p;
memcpy(e, str, str_len);
e += str_len;
e = zend_mempcpy(e, ZSTR_VAL(haystack) + (p - lc_haystack), r - p);
e = zend_mempcpy(e, str, str_len);
(*replace_count)++;
}
if (p < end) {
memcpy(e, ZSTR_VAL(haystack) + (p - lc_haystack), end - p);
e += end - p;
e = zend_mempcpy(e, ZSTR_VAL(haystack) + (p - lc_haystack), end - p);
}
*e = '\0';
@@ -3163,15 +3149,12 @@ PHPAPI zend_string *php_str_to_str(const char *haystack, size_t length, const ch
s = e = ZSTR_VAL(new_str);
end = haystack + length;
for (p = haystack; (r = (char*)php_memnstr(p, needle, needle_len, end)); p = r + needle_len) {
memcpy(e, p, r - p);
e += r - p;
memcpy(e, str, str_len);
e += str_len;
e = zend_mempcpy(e, p, r - p);
e = zend_mempcpy(e, str, str_len);
}
if (p < end) {
memcpy(e, p, end - p);
e += end - p;
e = zend_mempcpy(e, p, end - p);
}
*e = '\0';
@@ -4924,8 +4907,7 @@ state_1:
*(tp++) = '>';
*tp='\0';
if (php_tag_find(tbuf, tp-tbuf, allow)) {
memcpy(rp, tbuf, tp-tbuf);
rp += tp-tbuf;
rp = zend_mempcpy(rp, tbuf, tp - tbuf);
}
tp = tbuf;
}

View File

@@ -725,8 +725,7 @@ static inline void php_var_serialize_long(smart_str *buf, zend_long val) /* {{{
char *s = zend_print_long_to_buf(b + sizeof(b) - 1, val);
size_t l = b + sizeof(b) - 1 - s;
char *res = smart_str_extend(buf, 2 + l + 1);
memcpy(res, "i:", 2);
res += 2;
res = zend_mempcpy(res, "i:", 2);
memcpy(res, s, l);
res[l] = ';';
}
@@ -738,14 +737,10 @@ static inline void php_var_serialize_string(smart_str *buf, char *str, size_t le
char *s = zend_print_long_to_buf(b + sizeof(b) - 1, len);
size_t l = b + sizeof(b) - 1 - s;
char *res = smart_str_extend(buf, 2 + l + 2 + len + 2);
memcpy(res, "s:", 2);
res += 2;
memcpy(res, s, l);
res += l;
memcpy(res, ":\"", 2);
res += 2;
memcpy(res, str, len);
res += len;
res = zend_mempcpy(res, "s:", 2);
res = zend_mempcpy(res, s, l);
res = zend_mempcpy(res, ":\"", 2);
res = zend_mempcpy(res, str, len);
memcpy(res, "\";", 2);
}
/* }}} */
@@ -760,14 +755,10 @@ static inline bool php_var_serialize_class_name(smart_str *buf, zval *struc) /*
char *s = zend_print_long_to_buf(b + sizeof(b) - 1, class_name_len);
size_t l = b + sizeof(b) - 1 - s;
char *res = smart_str_extend(buf, 2 + l + 2 + class_name_len + 2);
memcpy(res, "O:", 2);
res += 2;
memcpy(res, s, l);
res += l;
memcpy(res, ":\"", 2);
res += 2;
memcpy(res, ZSTR_VAL(class_name), class_name_len);
res += class_name_len;
res = zend_mempcpy(res, "O:", 2);
res = zend_mempcpy(res, s, l);
res = zend_mempcpy(res, ":\"", 2);
res = zend_mempcpy(res, ZSTR_VAL(class_name), class_name_len);
memcpy(res, "\":", 2);
PHP_CLEANUP_CLASS_ATTRIBUTES();
return incomplete_class;
@@ -1037,8 +1028,7 @@ again:
size_t len = strlen(tmp_str);
char *res = smart_str_extend(buf, 2 + len + 1);
memcpy(res, "d:", 2);
res += 2;
res = zend_mempcpy(res, "d:", 2);
memcpy(res, tmp_str, len);
res[len] = ';';
return;
@@ -1125,21 +1115,13 @@ again:
char *s2 = zend_print_long_to_buf(b2 + sizeof(b2) - 1, serialized_length);
size_t l2 = b2 + sizeof(b2) - 1 - s2;
char *res = smart_str_extend(buf, 2 + l1 + 2 + ZSTR_LEN(Z_OBJCE_P(struc)->name) + 2 + l2 + 2 + serialized_length + 1);
memcpy(res, "C:", 2);
res += 2;
memcpy(res, s1, l1);
res += l1;
memcpy(res, ":\"", 2);
res += 2;
memcpy(res, ZSTR_VAL(Z_OBJCE_P(struc)->name), ZSTR_LEN(Z_OBJCE_P(struc)->name));
res += ZSTR_LEN(Z_OBJCE_P(struc)->name);
memcpy(res, "\":", 2);
res += 2;
memcpy(res, s2, l2);
res += l2;
memcpy(res, ":{", 2);
res += 2;
res = zend_mempcpy(res, "C:", 2);
res = zend_mempcpy(res, s1, l1);
res = zend_mempcpy(res, ":\"", 2);
res = zend_mempcpy(res, ZSTR_VAL(Z_OBJCE_P(struc)->name), ZSTR_LEN(Z_OBJCE_P(struc)->name));
res = zend_mempcpy(res, "\":", 2);
res = zend_mempcpy(res, s2, l2);
res = zend_mempcpy(res, ":{", 2);
memcpy(res, (char *) serialized_data, serialized_length);
res[serialized_length] = '}';
} else {

View File

@@ -322,10 +322,8 @@ static inline char *get_default_content_type(uint32_t prefix_len, uint32_t *len)
*len = prefix_len + mimetype_len + sizeof("; charset=") - 1 + charset_len;
content_type = (char*)emalloc(*len + 1);
p = content_type + prefix_len;
memcpy(p, mimetype, mimetype_len);
p += mimetype_len;
memcpy(p, "; charset=", sizeof("; charset=") - 1);
p += sizeof("; charset=") - 1;
p = zend_mempcpy(p, mimetype, mimetype_len);
p = zend_mempcpy(p, "; charset=", sizeof("; charset=") - 1);
memcpy(p, charset, charset_len + 1);
} else {
*len = prefix_len + mimetype_len;

View File

@@ -1190,10 +1190,8 @@ static int fcgi_read_request(fcgi_request *req)
*p++ = (zlen >> 8) & 0xff;
*p++ = zlen & 0xff;
}
memcpy(p, q->var, q->var_len);
p += q->var_len;
memcpy(p, Z_STRVAL_P(value), zlen);
p += zlen;
p = zend_mempcpy(p, q->var, q->var_len);
p = zend_mempcpy(p, Z_STRVAL_P(value), zlen);
q = q->list_next;
}
len = (int)(p - buf - sizeof(fcgi_header));
@@ -1598,23 +1596,20 @@ int fcgi_write(fcgi_request *req, fcgi_request_type type, const char *str, int l
if (!req->out_hdr) {
open_packet(req, type);
}
memcpy(req->out_pos, str, len);
req->out_pos += len;
req->out_pos = zend_mempcpy(req->out_pos, str, len);
} else if (len - limit < (int)(sizeof(req->out_buf) - sizeof(fcgi_header))) {
if (limit > 0) {
if (!req->out_hdr) {
open_packet(req, type);
}
memcpy(req->out_pos, str, limit);
req->out_pos += limit;
req->out_pos = zend_mempcpy(req->out_pos, str, limit);
}
if (!fcgi_flush(req, 0)) {
return -1;
}
if (len > limit) {
open_packet(req, type);
memcpy(req->out_pos, str + limit, len - limit);
req->out_pos += len - limit;
req->out_pos = zend_mempcpy(req->out_pos, str + limit, len - limit);
}
} else {
int pos = 0;
@@ -1650,8 +1645,7 @@ int fcgi_write(fcgi_request *req, fcgi_request_type type, const char *str, int l
}
if (pad) {
open_packet(req, type);
memcpy(req->out_pos, str + len - rest, rest);
req->out_pos += rest;
req->out_pos = zend_mempcpy(req->out_pos, str + len - rest, rest);
}
}
#endif

View File

@@ -146,12 +146,10 @@ int fuzzer_init_php(const char *extra_ini)
}
char *p = malloc(ini_len + 1);
fuzzer_module.ini_entries = p;
memcpy(p, HARDCODED_INI, sizeof(HARDCODED_INI) - 1);
p += sizeof(HARDCODED_INI) - 1;
p = zend_mempcpy(p, HARDCODED_INI, sizeof(HARDCODED_INI) - 1);
if (extra_ini) {
*p++ = '\n';
memcpy(p, extra_ini, extra_ini_len);
p += extra_ini_len;
p = zend_mempcpy(p, extra_ini, extra_ini_len);
}
*p = '\0';

View File

@@ -98,14 +98,12 @@ static void pretty_print(const char *text)
} else if (UNEXPECTED(p[0] == '*') && p[1] == '*') {
if (bold_escape_len) {
in_bold = !in_bold;
memcpy (q, in_bold ? bold_on_escape : bold_off_escape, bold_escape_len);
q += bold_escape_len;
q = zend_mempcpy(q, in_bold ? bold_on_escape : bold_off_escape, bold_escape_len);
/* bold on/off has zero print width so line count is unchanged */
}
p++;
} else if (UNEXPECTED(p[0] == '$') && p[1] == 'P') {
memcpy (q, prompt_escape, prompt_escape_len);
q += prompt_escape_len;
q = zend_mempcpy(q, prompt_escape, prompt_escape_len);
line_count += prompt_len;
p++;
} else if (UNEXPECTED(p[0] == '\\')) {