@@ -44,6 +44,13 @@ static int php_sqlite3_compare_stmt_zval_free(php_sqlite3_free_list **free_list,
44
44
RETURN_THROWS(); \
45
45
}
46
46
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
+
47
54
#define SQLITE3_CHECK_INITIALIZED_STMT (member , class_name ) \
48
55
if (!(member)) { \
49
56
zend_throw_error(NULL, "The " #class_name " object has not been correctly initialised or is already closed"); \
@@ -936,33 +943,29 @@ PHP_METHOD(SQLite3, createFunction)
936
943
php_sqlite3_func * func ;
937
944
char * sql_func ;
938
945
size_t sql_func_len ;
939
- zend_fcall_info fci ;
940
- zend_fcall_info_cache fcc ;
946
+ zend_fcall_info fci = empty_fcall_info ;
947
+ zend_fcall_info_cache fcc = empty_fcall_info_cache ;
941
948
zend_long sql_func_num_args = -1 ;
942
949
zend_long flags = 0 ;
943
950
db_obj = Z_SQLITE3_DB_P (object );
944
951
945
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "sf|ll" , & sql_func , & sql_func_len , & fci , & fcc , & sql_func_num_args , & flags ) == FAILURE ) {
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 );
946
954
RETURN_THROWS ();
947
955
}
948
956
949
- SQLITE3_CHECK_INITIALIZED (db_obj , db_obj -> initialised , SQLite3 )
957
+ SQLITE3_CHECK_INITIALIZED_FREE_TRAMPOLINE (db_obj , db_obj -> initialised , SQLite3 , & fcc );
950
958
951
959
if (!sql_func_len ) {
960
+ /* TODO Add warning/ValueError that name cannot be empty? */
961
+ zend_release_fcall_info_cache (& fcc );
952
962
RETURN_FALSE ;
953
963
}
954
964
955
965
func = (php_sqlite3_func * )ecalloc (1 , sizeof (* func ));
956
966
957
967
if (sqlite3_create_function (db_obj -> db , sql_func , sql_func_num_args , flags | SQLITE_UTF8 , func , php_sqlite3_callback_func , NULL , NULL ) == SQLITE_OK ) {
958
968
func -> func_name = estrdup (sql_func );
959
-
960
- if (!ZEND_FCC_INITIALIZED (fcc )) {
961
- zend_is_callable_ex (& fci .function_name , NULL , IS_CALLABLE_SUPPRESS_DEPRECATIONS , NULL , & fcc , NULL );
962
- /* Call trampoline has been cleared by zpp. Refetch it, because we want to deal
963
- * with it outselves. It is important that it is not refetched on every call,
964
- * because calls may occur from different scopes. */
965
- }
966
969
zend_fcc_dup (& func -> func , & fcc );
967
970
968
971
func -> argc = sql_func_num_args ;
@@ -972,6 +975,7 @@ PHP_METHOD(SQLite3, createFunction)
972
975
RETURN_TRUE ;
973
976
}
974
977
efree (func );
978
+ zend_release_fcall_info_cache (& fcc );
975
979
976
980
RETURN_FALSE ;
977
981
}
@@ -985,39 +989,34 @@ PHP_METHOD(SQLite3, createAggregate)
985
989
php_sqlite3_func * func ;
986
990
char * sql_func ;
987
991
size_t sql_func_len ;
988
- zend_fcall_info step_fci , fini_fci ;
989
- zend_fcall_info_cache step_fcc , fini_fcc ;
992
+ zend_fcall_info step_fci = empty_fcall_info ;
993
+ zend_fcall_info_cache step_fcc = empty_fcall_info_cache ;
994
+ zend_fcall_info fini_fci = empty_fcall_info ;
995
+ zend_fcall_info_cache fini_fcc = empty_fcall_info_cache ;
990
996
zend_long sql_func_num_args = -1 ;
991
997
db_obj = Z_SQLITE3_DB_P (object );
992
998
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 ) {
994
- RETURN_THROWS () ;
999
+ 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 ) {
1000
+ goto error ;
995
1001
}
996
1002
997
- SQLITE3_CHECK_INITIALIZED (db_obj , db_obj -> initialised , SQLite3 )
1003
+ /* Cannot use SQLITE3_CHECK_INITIALIZED_FREE_TRAMPOLINE() as we have 2 FCCs */
1004
+ if (!db_obj || !db_obj -> initialised ) {
1005
+ zend_throw_error (NULL , "The SQLite3 object has not been correctly initialised or is already closed" );
1006
+ goto error ;
1007
+ }
998
1008
999
1009
if (!sql_func_len ) {
1000
- RETURN_FALSE ;
1010
+ /* TODO Add warning/ValueError that name cannot be empty? */
1011
+ goto error ;
1001
1012
}
1002
1013
1003
1014
func = (php_sqlite3_func * )ecalloc (1 , sizeof (* func ));
1004
1015
1005
1016
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 ) {
1006
1017
func -> func_name = estrdup (sql_func );
1007
1018
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
- }
1014
1019
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
- }
1021
1020
zend_fcc_dup (& func -> fini , & fini_fcc );
1022
1021
1023
1022
func -> argc = sql_func_num_args ;
@@ -1028,6 +1027,10 @@ PHP_METHOD(SQLite3, createAggregate)
1028
1027
}
1029
1028
efree (func );
1030
1029
1030
+ error :
1031
+ zend_release_fcall_info_cache (& step_fcc );
1032
+ zend_release_fcall_info_cache (& fini_fcc );
1033
+
1031
1034
RETURN_FALSE ;
1032
1035
}
1033
1036
/* }}} */
@@ -1040,30 +1043,26 @@ PHP_METHOD(SQLite3, createCollation)
1040
1043
php_sqlite3_collation * collation ;
1041
1044
char * collation_name ;
1042
1045
size_t collation_name_len ;
1043
- zend_fcall_info fci ;
1044
- zend_fcall_info_cache fcc ;
1046
+ zend_fcall_info fci = empty_fcall_info ;
1047
+ zend_fcall_info_cache fcc = empty_fcall_info_cache ;
1045
1048
db_obj = Z_SQLITE3_DB_P (object );
1046
1049
1047
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "sf " , & collation_name , & collation_name_len , & fci , & fcc ) == FAILURE ) {
1050
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "sF " , & collation_name , & collation_name_len , & fci , & fcc ) == FAILURE ) {
1048
1051
RETURN_THROWS ();
1049
1052
}
1050
1053
1051
- SQLITE3_CHECK_INITIALIZED (db_obj , db_obj -> initialised , SQLite3 )
1054
+ SQLITE3_CHECK_INITIALIZED_FREE_TRAMPOLINE (db_obj , db_obj -> initialised , SQLite3 , & fcc );
1052
1055
1053
1056
if (!collation_name_len ) {
1057
+ /* TODO Add warning/ValueError that name cannot be empty? */
1058
+ zend_release_fcall_info_cache (& fcc );
1054
1059
RETURN_FALSE ;
1055
1060
}
1056
1061
1057
1062
collation = (php_sqlite3_collation * )ecalloc (1 , sizeof (* collation ));
1058
1063
if (sqlite3_create_collation (db_obj -> db , collation_name , SQLITE_UTF8 , collation , php_sqlite3_callback_compare ) == SQLITE_OK ) {
1059
1064
collation -> collation_name = estrdup (collation_name );
1060
1065
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
- }
1067
1066
zend_fcc_dup (& collation -> cmp_func , & fcc );
1068
1067
1069
1068
collation -> next = db_obj -> collations ;
@@ -1072,6 +1071,7 @@ PHP_METHOD(SQLite3, createCollation)
1072
1071
RETURN_TRUE ;
1073
1072
}
1074
1073
efree (collation );
1074
+ zend_release_fcall_info_cache (& fcc );
1075
1075
1076
1076
RETURN_FALSE ;
1077
1077
}
@@ -1310,17 +1310,16 @@ PHP_METHOD(SQLite3, enableExceptions)
1310
1310
/* {{{ Register a callback function to be used as an authorizer by SQLite. The callback should return SQLite3::OK, SQLite3::IGNORE or SQLite3::DENY. */
1311
1311
PHP_METHOD (SQLite3 , setAuthorizer )
1312
1312
{
1313
- php_sqlite3_db_object * db_obj ;
1314
- zval * object = ZEND_THIS ;
1315
- db_obj = Z_SQLITE3_DB_P (object );
1316
- zend_fcall_info fci ;
1317
- zend_fcall_info_cache fcc ;
1313
+ zend_fcall_info fci = empty_fcall_info ;
1314
+ zend_fcall_info_cache fcc = empty_fcall_info_cache ;
1318
1315
1319
1316
ZEND_PARSE_PARAMETERS_START (1 , 1 )
1320
- Z_PARAM_FUNC_OR_NULL (fci , fcc )
1317
+ Z_PARAM_FUNC_NO_TRAMPOLINE_FREE_OR_NULL (fci , fcc )
1321
1318
ZEND_PARSE_PARAMETERS_END ();
1322
1319
1323
- SQLITE3_CHECK_INITIALIZED (db_obj , db_obj -> initialised , SQLite3 )
1320
+ php_sqlite3_db_object * db_obj = Z_SQLITE3_DB_P (ZEND_THIS );
1321
+
1322
+ SQLITE3_CHECK_INITIALIZED_FREE_TRAMPOLINE (db_obj , db_obj -> initialised , SQLite3 , & fcc );
1324
1323
1325
1324
/* Clear previously set callback */
1326
1325
if (ZEND_FCC_INITIALIZED (db_obj -> authorizer_fcc )) {
@@ -1329,14 +1328,7 @@ PHP_METHOD(SQLite3, setAuthorizer)
1329
1328
1330
1329
/* Only enable userland authorizer if argument is not NULL */
1331
1330
if (ZEND_FCI_INITIALIZED (fci )) {
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 );
1331
+ zend_fcc_dup (& db_obj -> authorizer_fcc , & fcc );
1340
1332
}
1341
1333
1342
1334
RETURN_TRUE ;
0 commit comments