mirror of
https://github.com/php/php-src.git
synced 2025-08-15 13:38:49 +02:00
Use zend_long for resource ID
Currently, resource IDs are limited to 32-bits. As resource IDs are not reused, this means that resource ID overflow for long-running processes is very possible. This patch switches resource IDs to use zend_long instead, which means that on 64-bit systems, 64-bit resource IDs will be used. This makes resource ID overflow practically impossible. The tradeoff is an 8 byte increase in zend_resource size. Closes GH-7436.
This commit is contained in:
parent
9b170a41a7
commit
14f599ea7d
8 changed files with 15 additions and 10 deletions
|
@ -9,6 +9,7 @@ PHP 8.1 INTERNALS UPGRADE NOTES
|
||||||
f. Non-serializable classes should use ZEND_ACC_NOT_SERIALIZABLE
|
f. Non-serializable classes should use ZEND_ACC_NOT_SERIALIZABLE
|
||||||
g. _zend_hash_find_known_hash renamed to zend_hash_find_known_hash
|
g. _zend_hash_find_known_hash renamed to zend_hash_find_known_hash
|
||||||
h. Renaming of ZEND_TYPE_HAS_CLASS() into ZEND_TYPE_IS_COMPLEX()
|
h. Renaming of ZEND_TYPE_HAS_CLASS() into ZEND_TYPE_IS_COMPLEX()
|
||||||
|
i. zend_resource handle is now zend_long
|
||||||
|
|
||||||
2. Build system changes
|
2. Build system changes
|
||||||
a. New compiler flags
|
a. New compiler flags
|
||||||
|
@ -58,6 +59,9 @@ PHP 8.1 INTERNALS UPGRADE NOTES
|
||||||
h. ZEND_TYPE_HAS_CLASS() has been renamed to ZEND_TYPE_IS_COMPLEX() for clarity.
|
h. ZEND_TYPE_HAS_CLASS() has been renamed to ZEND_TYPE_IS_COMPLEX() for clarity.
|
||||||
A zend_type element can contain a zend_type_list which might be either a union or an intersection,
|
A zend_type element can contain a zend_type_list which might be either a union or an intersection,
|
||||||
or a single class stored as either a zend_string* or a zend_class_entry*.
|
or a single class stored as either a zend_string* or a zend_class_entry*.
|
||||||
|
i. The handle member of zend_resource (the resource ID) now has type zend_long
|
||||||
|
rather than int. This should be transparent to most code, but uses in
|
||||||
|
printf may need to switch from "%d" to ZEND_LONG_FMT.
|
||||||
|
|
||||||
========================
|
========================
|
||||||
2. Build system changes
|
2. Build system changes
|
||||||
|
|
|
@ -2166,7 +2166,9 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_cannot_add_element(vo
|
||||||
|
|
||||||
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_use_resource_as_offset(const zval *dim)
|
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_use_resource_as_offset(const zval *dim)
|
||||||
{
|
{
|
||||||
zend_error(E_WARNING, "Resource ID#%d used as offset, casting to integer (%d)", Z_RES_HANDLE_P(dim), Z_RES_HANDLE_P(dim));
|
zend_error(E_WARNING,
|
||||||
|
"Resource ID#" ZEND_LONG_FMT " used as offset, casting to integer (" ZEND_LONG_FMT ")",
|
||||||
|
Z_RES_HANDLE_P(dim), Z_RES_HANDLE_P(dim));
|
||||||
}
|
}
|
||||||
|
|
||||||
static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_use_new_element_for_string(void)
|
static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_use_new_element_for_string(void)
|
||||||
|
|
|
@ -31,13 +31,12 @@ static HashTable list_destructors;
|
||||||
|
|
||||||
ZEND_API zval* ZEND_FASTCALL zend_list_insert(void *ptr, int type)
|
ZEND_API zval* ZEND_FASTCALL zend_list_insert(void *ptr, int type)
|
||||||
{
|
{
|
||||||
int index;
|
|
||||||
zval zv;
|
zval zv;
|
||||||
|
|
||||||
index = zend_hash_next_free_element(&EG(regular_list));
|
zend_long index = zend_hash_next_free_element(&EG(regular_list));
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
index = 1;
|
index = 1;
|
||||||
} else if (index == INT_MAX) {
|
} else if (index == ZEND_LONG_MAX) {
|
||||||
zend_error_noreturn(E_ERROR, "Resource ID space overflow");
|
zend_error_noreturn(E_ERROR, "Resource ID space overflow");
|
||||||
}
|
}
|
||||||
ZVAL_NEW_RES(&zv, index, ptr, type);
|
ZVAL_NEW_RES(&zv, index, ptr, type);
|
||||||
|
|
|
@ -485,7 +485,7 @@ struct _zend_object {
|
||||||
|
|
||||||
struct _zend_resource {
|
struct _zend_resource {
|
||||||
zend_refcounted_h gc;
|
zend_refcounted_h gc;
|
||||||
int handle; // TODO: may be removed ???
|
zend_long handle; // TODO: may be removed ???
|
||||||
int type;
|
int type;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1711,7 +1711,7 @@ int php_oci_column_to_zval(php_oci_out_column *column, zval *value, int mode)
|
||||||
descriptor = (php_oci_descriptor *) column->descid->ptr;
|
descriptor = (php_oci_descriptor *) column->descid->ptr;
|
||||||
|
|
||||||
if (!descriptor) {
|
if (!descriptor) {
|
||||||
php_error_docref(NULL, E_WARNING, "Unable to find LOB descriptor #%d", column->descid->handle);
|
php_error_docref(NULL, E_WARNING, "Unable to find LOB descriptor #" ZEND_LONG_FMT, column->descid->handle);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -908,7 +908,7 @@ PHPAPI PHP_FUNCTION(fclose)
|
||||||
PHP_STREAM_TO_ZVAL(stream, res);
|
PHP_STREAM_TO_ZVAL(stream, res);
|
||||||
|
|
||||||
if ((stream->flags & PHP_STREAM_FLAG_NO_FCLOSE) != 0) {
|
if ((stream->flags & PHP_STREAM_FLAG_NO_FCLOSE) != 0) {
|
||||||
php_error_docref(NULL, E_WARNING, "%d is not a valid stream resource", stream->res->handle);
|
php_error_docref(NULL, E_WARNING, ZEND_LONG_FMT " is not a valid stream resource", stream->res->handle);
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -195,7 +195,7 @@ again:
|
||||||
}
|
}
|
||||||
case IS_RESOURCE: {
|
case IS_RESOURCE: {
|
||||||
const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(struc));
|
const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(struc));
|
||||||
php_printf("%sresource(%d) of type (%s)\n", COMMON, Z_RES_P(struc)->handle, type_name ? type_name : "Unknown");
|
php_printf("%sresource(" ZEND_LONG_FMT ") of type (%s)\n", COMMON, Z_RES_P(struc)->handle, type_name ? type_name : "Unknown");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IS_REFERENCE:
|
case IS_REFERENCE:
|
||||||
|
@ -380,7 +380,7 @@ PHPAPI void php_debug_zval_dump(zval *struc, int level) /* {{{ */
|
||||||
break;
|
break;
|
||||||
case IS_RESOURCE: {
|
case IS_RESOURCE: {
|
||||||
const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(struc));
|
const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(struc));
|
||||||
php_printf("resource(%d) of type (%s) refcount(%u)\n", Z_RES_P(struc)->handle, type_name ? type_name : "Unknown", Z_REFCOUNT_P(struc));
|
php_printf("resource(" ZEND_LONG_FMT ") of type (%s) refcount(%u)\n", Z_RES_P(struc)->handle, type_name ? type_name : "Unknown", Z_REFCOUNT_P(struc));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IS_REFERENCE:
|
case IS_REFERENCE:
|
||||||
|
|
|
@ -702,7 +702,7 @@ char *phpdbg_short_zval_print(zval *zv, int maxlen) /* {{{ */
|
||||||
zend_string_release(str);
|
zend_string_release(str);
|
||||||
} break;
|
} break;
|
||||||
case IS_RESOURCE:
|
case IS_RESOURCE:
|
||||||
spprintf(&decode, 0, "Rsrc #%d", Z_RES_HANDLE_P(zv));
|
spprintf(&decode, 0, "Rsrc #" ZEND_LONG_FMT, Z_RES_HANDLE_P(zv));
|
||||||
break;
|
break;
|
||||||
case IS_ARRAY:
|
case IS_ARRAY:
|
||||||
spprintf(&decode, 0, "array(%d)", zend_hash_num_elements(Z_ARR_P(zv)));
|
spprintf(&decode, 0, "array(%d)", zend_hash_num_elements(Z_ARR_P(zv)));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue