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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
116
ext/ffi/ffi.c
116
ext/ffi/ffi.c
@@ -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;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user