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

Merge branch 'PHP-7.4'

This commit is contained in:
Nikita Popov
2019-06-25 14:30:24 +02:00
11 changed files with 106 additions and 54 deletions

View File

@@ -206,7 +206,7 @@ void plist_entry_destructor(zval *zv)
free(res);
}
int zend_init_rsrc_list(void)
ZEND_API int zend_init_rsrc_list(void)
{
zend_hash_init(&EG(regular_list), 8, NULL, list_entry_destructor, 0);
EG(regular_list).nNextFreeElement = 0;

View File

@@ -45,7 +45,7 @@ void list_entry_destructor(zval *ptr);
void plist_entry_destructor(zval *ptr);
void zend_clean_module_rsrc_dtors(int module_number);
int zend_init_rsrc_list(void);
ZEND_API int zend_init_rsrc_list(void); /* Exported for phar hack */
int zend_init_rsrc_plist(void);
void zend_close_rsrc_list(HashTable *ht);
void zend_destroy_rsrc_list(HashTable *ht);

View File

@@ -3432,11 +3432,12 @@ PHP_FUNCTION(curl_getinfo)
case CURLINFO_SLIST:
{
struct curl_slist *slist;
array_init(return_value);
if (curl_easy_getinfo(ch->cp, option, &slist) == CURLE_OK) {
while (slist) {
add_next_index_string(return_value, slist->data);
slist = slist->next;
struct curl_slist *current = slist;
array_init(return_value);
while (current) {
add_next_index_string(return_value, current->data);
current = current->next;
}
curl_slist_free_all(slist);
} else {

View File

@@ -531,32 +531,60 @@ again:
}
/* }}} */
static uint64_t zend_ffi_bit_field_read(void *ptr, zend_ffi_field *field) /* {{{ */
{
size_t bit = field->first_bit;
size_t last_bit = bit + field->bits - 1;
uint8_t *p = (uint8_t *) ptr + bit / 8;
uint8_t *last_p = (uint8_t *) ptr + last_bit / 8;
size_t pos = bit % 8;
size_t insert_pos = 0;
uint8_t mask;
uint64_t val = 0;
/* Bitfield fits into a single byte */
if (p == last_p) {
mask = (1U << field->bits) - 1U;
return (*p >> pos) & mask;
}
/* Read partial prefix byte */
if (pos != 0) {
size_t num_bits = 8 - pos;
mask = ((1U << num_bits) - 1U) << pos;
val = (*p++ >> pos) & mask;
insert_pos += num_bits;
}
/* Read full bytes */
while (p < last_p) {
val |= *p++ << insert_pos;
insert_pos += 8;
}
/* Read partial suffix byte */
if (p == last_p) {
size_t num_bits = last_bit % 8 + 1;
mask = (1U << num_bits) - 1U;
val |= (*p & mask) << insert_pos;
}
return val;
}
static void zend_ffi_bit_field_to_zval(void *ptr, zend_ffi_field *field, zval *rv) /* {{{ */
{
uint64_t *p1 = (uint64_t *)((char*)ptr + (field->first_bit / 64) * 8);
uint64_t *p2 = (uint64_t *)((char*)ptr + ((field->first_bit + field->bits - 1) / 64) * 8);
uint64_t pos = field->first_bit % 64;
uint64_t shift = 64 - (field->bits % 64);
uint64_t val;
if (p1 == p2) {
if (field->bits == 64) {
val = *p1;
shift = 0;
} else {
val = *p1 << (shift - pos);
}
} else {
val = (*p1 >> pos) | (*p2 << (64 - pos));
}
uint64_t val = zend_ffi_bit_field_read(ptr, field);
if (ZEND_FFI_TYPE(field->type)->kind == ZEND_FFI_TYPE_CHAR
|| ZEND_FFI_TYPE(field->type)->kind == ZEND_FFI_TYPE_SINT8
|| ZEND_FFI_TYPE(field->type)->kind == ZEND_FFI_TYPE_SINT16
|| ZEND_FFI_TYPE(field->type)->kind == ZEND_FFI_TYPE_SINT32
|| ZEND_FFI_TYPE(field->type)->kind == ZEND_FFI_TYPE_SINT64) {
val = (int64_t)val >> shift;
} else {
val = val >> shift;
/* Sign extend */
uint64_t shift = 64 - (field->bits % 64);
if (shift != 0) {
val = (int64_t)(val << shift) >> shift;
}
}
ZVAL_LONG(rv, val);
}
@@ -564,25 +592,43 @@ static void zend_ffi_bit_field_to_zval(void *ptr, zend_ffi_field *field, zval *r
static int zend_ffi_zval_to_bit_field(void *ptr, zend_ffi_field *field, zval *value) /* {{{ */
{
uint64_t *p1 = (uint64_t *)((char*)ptr + (field->first_bit / 64) * 8);
uint64_t *p2 = (uint64_t *)((char*)ptr + ((field->first_bit + field->bits - 1) / (8 * 8)) * 8);
uint64_t pos = field->first_bit % 64;
uint64_t mask;
uint64_t val = zval_get_long(value);
size_t bit = field->first_bit;
size_t last_bit = bit + field->bits - 1;
uint8_t *p = (uint8_t *) ptr + bit / 8;
uint8_t *last_p = (uint8_t *) ptr + last_bit / 8;
size_t pos = bit % 8;
uint8_t mask;
if (p1 == p2) {
if (field->bits == 64) {
*p1 = val;
} else {
mask = ((1ULL << field->bits) - 1ULL) << pos;
*p1 = (*p1 & ~mask) | ((val << pos) & mask);
}
} else {
mask = ((1ULL << (64 - pos)) - 1ULL) << pos;
*p1 = (*p1 & ~mask) | ((val << pos) & mask);
mask = (1ULL << pos) - 1ULL;
*p2 = (*p2 & ~mask) | ((val >> (64 - pos)) & mask);
/* Bitfield fits into a single byte */
if (p == last_p) {
mask = ((1U << field->bits) - 1U) << pos;
*p = (*p & ~mask) | ((val << pos) & mask);
return SUCCESS;
}
/* Write partial prefix byte */
if (pos != 0) {
size_t num_bits = 8 - pos;
mask = ((1U << num_bits) - 1U) << pos;
*p = (*p & ~mask) | ((val << pos) & mask);
p++;
val >>= num_bits;
}
/* Write full bytes */
while (p < last_p) {
*p++ = val;
val >>= 8;
}
/* Write partial suffix byte */
if (p == last_p) {
size_t num_bits = last_bit % 8 + 1;
mask = (1U << num_bits) - 1U;
*p = (*p & ~mask) | (val & mask);
}
return SUCCESS;
}
/* }}} */

View File

@@ -287,9 +287,10 @@ ftp_login(ftpbuf_t *ftp, const char *user, const size_t user_len, const char *pa
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_BOTH);
ftp->ssl_handle = SSL_new(ctx);
SSL_CTX_free(ctx);
if (ftp->ssl_handle == NULL) {
php_error_docref(NULL, E_WARNING, "failed to create the SSL handle");
SSL_CTX_free(ctx);
return 0;
}

View File

@@ -820,7 +820,7 @@ static PHP_METHOD(UConverter, transcode) {
if (U_SUCCESS(error) &&
(ret = php_converter_do_convert(dest_cnv, src_cnv, str, str_len, NULL)) != NULL) {
RETURN_NEW_STR(ret);
RETVAL_NEW_STR(ret);
}
if (U_FAILURE(error)) {

View File

@@ -343,20 +343,24 @@ static void umsg_set_timezone(MessageFormatter_object *mfo,
}
if (used_tz == NULL) {
zval nullzv, *zvptr = &nullzv;
ZVAL_NULL(zvptr);
used_tz = timezone_process_timezone_argument(zvptr, &err, "msgfmt_format");
zval nullzv;
ZVAL_NULL(&nullzv);
used_tz = timezone_process_timezone_argument(&nullzv, &err, "msgfmt_format");
if (used_tz == NULL) {
continue;
}
}
df->setTimeZone(*used_tz);
df->adoptTimeZone(used_tz->clone());
}
if (U_SUCCESS(err.code)) {
mfo->mf_data.tz_set = 1;
}
if (used_tz) {
delete used_tz;
}
}
U_CFUNC void umsg_format_helper(MessageFormatter_object *mfo,

View File

@@ -113,7 +113,7 @@ static void phar_split_cache_list(void) /* {{{ */
/* fake request startup */
PHAR_G(request_init) = 1;
zend_hash_init(&EG(regular_list), 0, NULL, NULL, 0);
zend_init_rsrc_list();
EG(regular_list).nNextFreeElement=1; /* we don't want resource id 0 */
PHAR_G(has_bz2) = zend_hash_str_exists(&module_registry, "bz2", sizeof("bz2")-1);

View File

@@ -136,6 +136,7 @@ PHP_METHOD(sqlite3, open)
rc = sqlite3_open_v2(fullpath, &(db_obj->db), flags, NULL);
if (rc != SQLITE_OK) {
sqlite3_close(db_obj->db);
zend_throw_exception_ex(zend_ce_exception, 0, "Unable to open database: %s",
#ifdef HAVE_SQLITE3_ERRSTR
db_obj->db ? sqlite3_errmsg(db_obj->db) : sqlite3_errstr(rc));
@@ -151,6 +152,7 @@ PHP_METHOD(sqlite3, open)
#if SQLITE_HAS_CODEC
if (encryption_key_len > 0) {
if (sqlite3_key(db_obj->db, encryption_key, encryption_key_len) != SQLITE_OK) {
sqlite3_close(db_obj->db);
zend_throw_exception_ex(zend_ce_exception, 0, "Unable to open database: %s", sqlite3_errmsg(db_obj->db));
return;
}

View File

@@ -63,7 +63,7 @@ function main()
if (getenv("TEST_PHP_WORKER")) {
$workerID = intval(getenv("TEST_PHP_WORKER"));
run_worker();
die;
return;
}
define('INIT_DIR', getcwd());
@@ -733,7 +733,7 @@ HELP;
exit(1);
}
exit(0);
return;
}
}
@@ -1731,11 +1731,9 @@ function run_worker() {
"type" => "error",
"msg" => "Unrecognised message type: $command[type]"
]);
die;
break 2;
}
}
die;
}
//

View File

@@ -838,7 +838,7 @@ PHPDBG_COMMAND(run) /* {{{ */
while (*p == ' ') p++;
while (*p) {
char sep = ' ';
char *buf = emalloc(end - p + 1), *q = buf;
char *buf = emalloc(end - p + 2), *q = buf;
if (*p == '<') {
/* use as STDIN */