Skip to content

Commit 77007f1

Browse files
committed
Revert "ext/sqlite3: Use new F ZPP modifier"
Check if the issue is related to SQLite3 changes or not This reverts commit c59d1c4.
1 parent c59d1c4 commit 77007f1

5 files changed

+34
-229
lines changed

ext/sqlite3/sqlite3.c

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,6 @@ static int php_sqlite3_compare_stmt_zval_free(php_sqlite3_free_list **free_list,
4444
RETURN_THROWS(); \
4545
}
4646

47-
#define SQLITE3_CHECK_INITIALIZED_FREE_TRAMPOLINE(db_obj, member, class_name, trampoline_fcc) \
48-
if (!(db_obj) || !(member)) { \
49-
zend_release_fcall_info_cache((trampoline_fcc)); \
50-
zend_throw_error(NULL, "The " #class_name " object has not been correctly initialised or is already closed"); \
51-
RETURN_THROWS(); \
52-
}
53-
5447
#define SQLITE3_CHECK_INITIALIZED_STMT(member, class_name) \
5548
if (!(member)) { \
5649
zend_throw_error(NULL, "The " #class_name " object has not been correctly initialised or is already closed"); \
@@ -949,16 +942,13 @@ PHP_METHOD(SQLite3, createFunction)
949942
zend_long flags = 0;
950943
db_obj = Z_SQLITE3_DB_P(object);
951944

952-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sF|ll", &sql_func, &sql_func_len, &fci, &fcc, &sql_func_num_args, &flags) == FAILURE) {
953-
zend_release_fcall_info_cache(&fcc);
945+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sf|ll", &sql_func, &sql_func_len, &fci, &fcc, &sql_func_num_args, &flags) == FAILURE) {
954946
RETURN_THROWS();
955947
}
956948

957-
SQLITE3_CHECK_INITIALIZED_FREE_TRAMPOLINE(db_obj, db_obj->initialised, SQLite3, &fcc);
949+
SQLITE3_CHECK_INITIALIZED(db_obj, db_obj->initialised, SQLite3)
958950

959951
if (!sql_func_len) {
960-
/* TODO Add warning/ValueError that name cannot be empty? */
961-
zend_release_fcall_info_cache(&fcc);
962952
RETURN_FALSE;
963953
}
964954

@@ -1000,24 +990,13 @@ PHP_METHOD(SQLite3, createAggregate)
1000990
zend_long sql_func_num_args = -1;
1001991
db_obj = Z_SQLITE3_DB_P(object);
1002992

1003-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sFF|l", &sql_func, &sql_func_len, &step_fci, &step_fcc, &fini_fci, &fini_fcc, &sql_func_num_args) == FAILURE) {
1004-
zend_release_fcall_info_cache(&step_fcc);
1005-
zend_release_fcall_info_cache(&fini_fcc);
993+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sff|l", &sql_func, &sql_func_len, &step_fci, &step_fcc, &fini_fci, &fini_fcc, &sql_func_num_args) == FAILURE) {
1006994
RETURN_THROWS();
1007995
}
1008996

1009-
/* Cannot use SQLITE3_CHECK_INITIALIZED_FREE_TRAMPOLINE() as we have 2 FCCs */
1010-
if (!db_obj || !db_obj->initialised) {
1011-
zend_release_fcall_info_cache(&step_fcc);
1012-
zend_release_fcall_info_cache(&fini_fcc);
1013-
zend_throw_error(NULL, "The SQLite3 object has not been correctly initialised or is already closed");
1014-
RETURN_THROWS();
1015-
}
997+
SQLITE3_CHECK_INITIALIZED(db_obj, db_obj->initialised, SQLite3)
1016998

1017999
if (!sql_func_len) {
1018-
/* TODO Add warning/ValueError that name cannot be empty? */
1019-
zend_release_fcall_info_cache(&step_fcc);
1020-
zend_release_fcall_info_cache(&fini_fcc);
10211000
RETURN_FALSE;
10221001
}
10231002

@@ -1026,7 +1005,19 @@ PHP_METHOD(SQLite3, createAggregate)
10261005
if (sqlite3_create_function(db_obj->db, sql_func, sql_func_num_args, SQLITE_UTF8, func, NULL, php_sqlite3_callback_step, php_sqlite3_callback_final) == SQLITE_OK) {
10271006
func->func_name = estrdup(sql_func);
10281007

1008+
if (!ZEND_FCC_INITIALIZED(step_fcc)) {
1009+
/* Call trampoline has been cleared by zpp. Refetch it, because we want to deal
1010+
* with it outselves. It is important that it is not refetched on every call,
1011+
* because calls may occur from different scopes. */
1012+
zend_is_callable_ex(&step_fci.function_name, NULL, IS_CALLABLE_SUPPRESS_DEPRECATIONS, NULL, &step_fcc, NULL);
1013+
}
10291014
zend_fcc_dup(&func->step, &step_fcc);
1015+
if (!ZEND_FCC_INITIALIZED(fini_fcc)) {
1016+
/* Call trampoline has been cleared by zpp. Refetch it, because we want to deal
1017+
* with it outselves. It is important that it is not refetched on every call,
1018+
* because calls may occur from different scopes. */
1019+
zend_is_callable_ex(&fini_fci.function_name, NULL, IS_CALLABLE_SUPPRESS_DEPRECATIONS, NULL, &fini_fcc, NULL);
1020+
}
10301021
zend_fcc_dup(&func->fini, &fini_fcc);
10311022

10321023
func->argc = sql_func_num_args;
@@ -1053,22 +1044,26 @@ PHP_METHOD(SQLite3, createCollation)
10531044
zend_fcall_info_cache fcc;
10541045
db_obj = Z_SQLITE3_DB_P(object);
10551046

1056-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sF", &collation_name, &collation_name_len, &fci, &fcc) == FAILURE) {
1047+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sf", &collation_name, &collation_name_len, &fci, &fcc) == FAILURE) {
10571048
RETURN_THROWS();
10581049
}
10591050

1060-
SQLITE3_CHECK_INITIALIZED_FREE_TRAMPOLINE(db_obj, db_obj->initialised, SQLite3, &fcc);
1051+
SQLITE3_CHECK_INITIALIZED(db_obj, db_obj->initialised, SQLite3)
10611052

10621053
if (!collation_name_len) {
1063-
/* TODO Add warning/ValueError that name cannot be empty? */
1064-
zend_release_fcall_info_cache(&fcc);
10651054
RETURN_FALSE;
10661055
}
10671056

10681057
collation = (php_sqlite3_collation *)ecalloc(1, sizeof(*collation));
10691058
if (sqlite3_create_collation(db_obj->db, collation_name, SQLITE_UTF8, collation, php_sqlite3_callback_compare) == SQLITE_OK) {
10701059
collation->collation_name = estrdup(collation_name);
10711060

1061+
if (!ZEND_FCC_INITIALIZED(fcc)) {
1062+
/* Call trampoline has been cleared by zpp. Refetch it, because we want to deal
1063+
* with it outselves. It is important that it is not refetched on every call,
1064+
* because calls may occur from different scopes. */
1065+
zend_is_callable_ex(&fci.function_name, NULL, IS_CALLABLE_SUPPRESS_DEPRECATIONS, NULL, &fcc, NULL);
1066+
}
10721067
zend_fcc_dup(&collation->cmp_func, &fcc);
10731068

10741069
collation->next = db_obj->collations;
@@ -1322,10 +1317,10 @@ PHP_METHOD(SQLite3, setAuthorizer)
13221317
zend_fcall_info_cache fcc;
13231318

13241319
ZEND_PARSE_PARAMETERS_START(1, 1)
1325-
Z_PARAM_FUNC_NO_TRAMPOLINE_FREE_OR_NULL(fci, fcc)
1320+
Z_PARAM_FUNC_OR_NULL(fci, fcc)
13261321
ZEND_PARSE_PARAMETERS_END();
13271322

1328-
SQLITE3_CHECK_INITIALIZED_FREE_TRAMPOLINE(db_obj, db_obj->initialised, SQLite3, &fcc);
1323+
SQLITE3_CHECK_INITIALIZED(db_obj, db_obj->initialised, SQLite3)
13291324

13301325
/* Clear previously set callback */
13311326
if (ZEND_FCC_INITIALIZED(db_obj->authorizer_fcc)) {
@@ -1334,7 +1329,14 @@ PHP_METHOD(SQLite3, setAuthorizer)
13341329

13351330
/* Only enable userland authorizer if argument is not NULL */
13361331
if (ZEND_FCI_INITIALIZED(fci)) {
1337-
zend_fcc_dup(&db_obj->authorizer_fcc, &fcc);
1332+
if (!ZEND_FCC_INITIALIZED(fcc)) {
1333+
zend_is_callable_ex(&fci.function_name, NULL, IS_CALLABLE_SUPPRESS_DEPRECATIONS, NULL, &fcc, NULL);
1334+
/* Call trampoline has been cleared by zpp. Refetch it, because we want to deal
1335+
* with it outselves. It is important that it is not refetched on every call,
1336+
* because calls may occur from different scopes. */
1337+
}
1338+
db_obj->authorizer_fcc = fcc;
1339+
zend_fcc_addref(&db_obj->authorizer_fcc);
13381340
}
13391341

13401342
RETURN_TRUE;

ext/sqlite3/tests/sqlite3_trampoline_create_aggregate_no_leak.phpt

Lines changed: 0 additions & 67 deletions
This file was deleted.

ext/sqlite3/tests/sqlite3_trampoline_createcollation_no_leak.phpt

Lines changed: 0 additions & 44 deletions
This file was deleted.

ext/sqlite3/tests/sqlite3_trampoline_createfunction_no_leak.phpt

Lines changed: 0 additions & 45 deletions
This file was deleted.

ext/sqlite3/tests/sqlite3_trampoline_setauthorizer_no_leak.phpt

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)