Skip to content

Commit b2c891f

Browse files
authored
Avoid string duplications in sqlite drivers (#17115)
These string duplications are necessary to unregister the callback later. We can just keep using zend_string to avoid memory duplications.
1 parent 4dc0555 commit b2c891f

File tree

4 files changed

+39
-45
lines changed

4 files changed

+39
-45
lines changed

ext/pdo_sqlite/php_pdo_sqlite_int.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct pdo_sqlite_func {
3030
struct pdo_sqlite_func *next;
3131

3232
int argc;
33-
const char *funcname;
33+
zend_string *funcname;
3434

3535
/* accelerated callback references */
3636
zend_fcall_info_cache func;
@@ -41,7 +41,7 @@ struct pdo_sqlite_func {
4141
struct pdo_sqlite_collation {
4242
struct pdo_sqlite_collation *next;
4343

44-
const char *name;
44+
zend_string *name;
4545
zend_fcall_info_cache callback;
4646
};
4747

ext/pdo_sqlite/sqlite_driver.c

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,14 @@ static void pdo_sqlite_cleanup_callbacks(pdo_sqlite_db_handle *H)
104104
if (H->db) {
105105
/* delete the function from the handle */
106106
sqlite3_create_function(H->db,
107-
func->funcname,
107+
ZSTR_VAL(func->funcname),
108108
func->argc,
109109
SQLITE_UTF8,
110110
func,
111111
NULL, NULL, NULL);
112112
}
113113

114-
efree((char*)func->funcname);
114+
zend_string_release(func->funcname);
115115
if (ZEND_FCC_INITIALIZED(func->func)) {
116116
zend_fcc_dtor(&func->func);
117117
}
@@ -132,13 +132,13 @@ static void pdo_sqlite_cleanup_callbacks(pdo_sqlite_db_handle *H)
132132
if (H->db) {
133133
/* delete the collation from the handle */
134134
sqlite3_create_collation(H->db,
135-
collation->name,
135+
ZSTR_VAL(collation->name),
136136
SQLITE_UTF8,
137137
collation,
138138
NULL);
139139
}
140140

141-
efree((char*)collation->name);
141+
zend_string_release(collation->name);
142142
if (ZEND_FCC_INITIALIZED(collation->callback)) {
143143
zend_fcc_dtor(&collation->callback);
144144
}
@@ -496,16 +496,15 @@ void pdo_sqlite_create_function_internal(INTERNAL_FUNCTION_PARAMETERS)
496496
struct pdo_sqlite_func *func;
497497
zend_fcall_info fci = empty_fcall_info;
498498
zend_fcall_info_cache fcc = empty_fcall_info_cache;
499-
char *func_name;
500-
size_t func_name_len;
499+
zend_string *func_name;
501500
zend_long argc = -1;
502501
zend_long flags = 0;
503502
pdo_dbh_t *dbh;
504503
pdo_sqlite_db_handle *H;
505504
int ret;
506505

507506
ZEND_PARSE_PARAMETERS_START(2, 4)
508-
Z_PARAM_STRING(func_name, func_name_len)
507+
Z_PARAM_STR(func_name)
509508
Z_PARAM_FUNC_NO_TRAMPOLINE_FREE(fci, fcc)
510509
Z_PARAM_OPTIONAL
511510
Z_PARAM_LONG(argc)
@@ -519,9 +518,9 @@ void pdo_sqlite_create_function_internal(INTERNAL_FUNCTION_PARAMETERS)
519518

520519
func = (struct pdo_sqlite_func*)ecalloc(1, sizeof(*func));
521520

522-
ret = sqlite3_create_function(H->db, func_name, argc, flags | SQLITE_UTF8, func, php_sqlite3_func_callback, NULL, NULL);
521+
ret = sqlite3_create_function(H->db, ZSTR_VAL(func_name), argc, flags | SQLITE_UTF8, func, php_sqlite3_func_callback, NULL, NULL);
523522
if (ret == SQLITE_OK) {
524-
func->funcname = estrdup(func_name);
523+
func->funcname = zend_string_copy(func_name);
525524

526525
zend_fcc_dup(&func->func, &fcc);
527526

@@ -555,15 +554,14 @@ void pdo_sqlite_create_aggregate_internal(INTERNAL_FUNCTION_PARAMETERS)
555554
zend_fcall_info fini_fci = empty_fcall_info;
556555
zend_fcall_info_cache step_fcc = empty_fcall_info_cache;
557556
zend_fcall_info_cache fini_fcc = empty_fcall_info_cache;
558-
char *func_name;
559-
size_t func_name_len;
557+
zend_string *func_name;
560558
zend_long argc = -1;
561559
pdo_dbh_t *dbh;
562560
pdo_sqlite_db_handle *H;
563561
int ret;
564562

565563
ZEND_PARSE_PARAMETERS_START(3, 4)
566-
Z_PARAM_STRING(func_name, func_name_len)
564+
Z_PARAM_STR(func_name)
567565
Z_PARAM_FUNC_NO_TRAMPOLINE_FREE(step_fci, step_fcc)
568566
Z_PARAM_FUNC_NO_TRAMPOLINE_FREE(fini_fci, fini_fcc)
569567
Z_PARAM_OPTIONAL
@@ -577,10 +575,10 @@ void pdo_sqlite_create_aggregate_internal(INTERNAL_FUNCTION_PARAMETERS)
577575

578576
func = (struct pdo_sqlite_func*)ecalloc(1, sizeof(*func));
579577

580-
ret = sqlite3_create_function(H->db, func_name, argc, SQLITE_UTF8, func, NULL,
578+
ret = sqlite3_create_function(H->db, ZSTR_VAL(func_name), argc, SQLITE_UTF8, func, NULL,
581579
php_sqlite3_func_step_callback, php_sqlite3_func_final_callback);
582580
if (ret == SQLITE_OK) {
583-
func->funcname = estrdup(func_name);
581+
func->funcname = zend_string_copy(func_name);
584582

585583
zend_fcc_dup(&func->step, &step_fcc);
586584
zend_fcc_dup(&func->fini, &fini_fcc);
@@ -631,14 +629,13 @@ void pdo_sqlite_create_collation_internal(INTERNAL_FUNCTION_PARAMETERS, pdo_sqli
631629
struct pdo_sqlite_collation *collation;
632630
zend_fcall_info fci = empty_fcall_info;
633631
zend_fcall_info_cache fcc = empty_fcall_info_cache;
634-
char *collation_name;
635-
size_t collation_name_len;
632+
zend_string *collation_name;
636633
pdo_dbh_t *dbh;
637634
pdo_sqlite_db_handle *H;
638635
int ret;
639636

640637
ZEND_PARSE_PARAMETERS_START(2, 2)
641-
Z_PARAM_STRING(collation_name, collation_name_len)
638+
Z_PARAM_STR(collation_name)
642639
Z_PARAM_FUNC_NO_TRAMPOLINE_FREE(fci, fcc)
643640
ZEND_PARSE_PARAMETERS_END();
644641

@@ -649,9 +646,9 @@ void pdo_sqlite_create_collation_internal(INTERNAL_FUNCTION_PARAMETERS, pdo_sqli
649646

650647
collation = (struct pdo_sqlite_collation*)ecalloc(1, sizeof(*collation));
651648

652-
ret = sqlite3_create_collation(H->db, collation_name, SQLITE_UTF8, collation, callback);
649+
ret = sqlite3_create_collation(H->db, ZSTR_VAL(collation_name), SQLITE_UTF8, collation, callback);
653650
if (ret == SQLITE_OK) {
654-
collation->name = estrdup(collation_name);
651+
collation->name = zend_string_copy(collation_name);
655652

656653
zend_fcc_dup(&collation->callback, &fcc);
657654

ext/sqlite3/php_sqlite3_structs.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ struct php_sqlite3_bound_param {
4444
typedef struct _php_sqlite3_func {
4545
struct _php_sqlite3_func *next;
4646

47-
const char *func_name;
47+
zend_string *func_name;
4848
int argc;
4949

5050
zend_fcall_info_cache func;
@@ -56,7 +56,7 @@ typedef struct _php_sqlite3_func {
5656
typedef struct _php_sqlite3_collation {
5757
struct _php_sqlite3_collation *next;
5858

59-
const char *collation_name;
59+
zend_string *collation_name;
6060
zend_fcall_info_cache cmp_func;
6161
} php_sqlite3_collation;
6262

ext/sqlite3/sqlite3.c

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -940,31 +940,30 @@ PHP_METHOD(SQLite3, createFunction)
940940
php_sqlite3_db_object *db_obj;
941941
zval *object = ZEND_THIS;
942942
php_sqlite3_func *func;
943-
char *sql_func;
944-
size_t sql_func_len;
943+
zend_string *sql_func;
945944
zend_fcall_info fci = empty_fcall_info;
946945
zend_fcall_info_cache fcc = empty_fcall_info_cache;
947946
zend_long sql_func_num_args = -1;
948947
zend_long flags = 0;
949948
db_obj = Z_SQLITE3_DB_P(object);
950949

951-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sF|ll", &sql_func, &sql_func_len, &fci, &fcc, &sql_func_num_args, &flags) == FAILURE) {
950+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "SF|ll", &sql_func, &fci, &fcc, &sql_func_num_args, &flags) == FAILURE) {
952951
zend_release_fcall_info_cache(&fcc);
953952
RETURN_THROWS();
954953
}
955954

956955
SQLITE3_CHECK_INITIALIZED_FREE_TRAMPOLINE(db_obj, db_obj->initialised, SQLite3, &fcc);
957956

958-
if (!sql_func_len) {
957+
if (!ZSTR_LEN(sql_func)) {
959958
/* TODO Add warning/ValueError that name cannot be empty? */
960959
zend_release_fcall_info_cache(&fcc);
961960
RETURN_FALSE;
962961
}
963962

964963
func = (php_sqlite3_func *)ecalloc(1, sizeof(*func));
965964

966-
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) {
967-
func->func_name = estrdup(sql_func);
965+
if (sqlite3_create_function(db_obj->db, ZSTR_VAL(sql_func), sql_func_num_args, flags | SQLITE_UTF8, func, php_sqlite3_callback_func, NULL, NULL) == SQLITE_OK) {
966+
func->func_name = zend_string_copy(sql_func);
968967
zend_fcc_dup(&func->func, &fcc);
969968

970969
func->argc = sql_func_num_args;
@@ -986,16 +985,15 @@ PHP_METHOD(SQLite3, createAggregate)
986985
php_sqlite3_db_object *db_obj;
987986
zval *object = ZEND_THIS;
988987
php_sqlite3_func *func;
989-
char *sql_func;
990-
size_t sql_func_len;
988+
zend_string *sql_func;
991989
zend_fcall_info step_fci = empty_fcall_info;
992990
zend_fcall_info_cache step_fcc = empty_fcall_info_cache;
993991
zend_fcall_info fini_fci = empty_fcall_info;
994992
zend_fcall_info_cache fini_fcc = empty_fcall_info_cache;
995993
zend_long sql_func_num_args = -1;
996994
db_obj = Z_SQLITE3_DB_P(object);
997995

998-
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) {
996+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "SFF|l", &sql_func, &step_fci, &step_fcc, &fini_fci, &fini_fcc, &sql_func_num_args) == FAILURE) {
999997
goto error;
1000998
}
1001999

@@ -1005,15 +1003,15 @@ PHP_METHOD(SQLite3, createAggregate)
10051003
goto error;
10061004
}
10071005

1008-
if (!sql_func_len) {
1006+
if (!ZSTR_LEN(sql_func)) {
10091007
/* TODO Add warning/ValueError that name cannot be empty? */
10101008
goto error;
10111009
}
10121010

10131011
func = (php_sqlite3_func *)ecalloc(1, sizeof(*func));
10141012

1015-
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) {
1016-
func->func_name = estrdup(sql_func);
1013+
if (sqlite3_create_function(db_obj->db, ZSTR_VAL(sql_func), sql_func_num_args, SQLITE_UTF8, func, NULL, php_sqlite3_callback_step, php_sqlite3_callback_final) == SQLITE_OK) {
1014+
func->func_name = zend_string_copy(sql_func);
10171015

10181016
zend_fcc_dup(&func->step, &step_fcc);
10191017
zend_fcc_dup(&func->fini, &fini_fcc);
@@ -1040,27 +1038,26 @@ PHP_METHOD(SQLite3, createCollation)
10401038
php_sqlite3_db_object *db_obj;
10411039
zval *object = ZEND_THIS;
10421040
php_sqlite3_collation *collation;
1043-
char *collation_name;
1044-
size_t collation_name_len;
1041+
zend_string *collation_name;
10451042
zend_fcall_info fci = empty_fcall_info;
10461043
zend_fcall_info_cache fcc = empty_fcall_info_cache;
10471044
db_obj = Z_SQLITE3_DB_P(object);
10481045

1049-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sF", &collation_name, &collation_name_len, &fci, &fcc) == FAILURE) {
1046+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "SF", &collation_name, &fci, &fcc) == FAILURE) {
10501047
RETURN_THROWS();
10511048
}
10521049

10531050
SQLITE3_CHECK_INITIALIZED_FREE_TRAMPOLINE(db_obj, db_obj->initialised, SQLite3, &fcc);
10541051

1055-
if (!collation_name_len) {
1052+
if (!ZSTR_LEN(collation_name)) {
10561053
/* TODO Add warning/ValueError that name cannot be empty? */
10571054
zend_release_fcall_info_cache(&fcc);
10581055
RETURN_FALSE;
10591056
}
10601057

10611058
collation = (php_sqlite3_collation *)ecalloc(1, sizeof(*collation));
1062-
if (sqlite3_create_collation(db_obj->db, collation_name, SQLITE_UTF8, collation, php_sqlite3_callback_compare) == SQLITE_OK) {
1063-
collation->collation_name = estrdup(collation_name);
1059+
if (sqlite3_create_collation(db_obj->db, ZSTR_VAL(collation_name), SQLITE_UTF8, collation, php_sqlite3_callback_compare) == SQLITE_OK) {
1060+
collation->collation_name = zend_string_copy(collation_name);
10641061

10651062
zend_fcc_dup(&collation->cmp_func, &fcc);
10661063

@@ -2193,10 +2190,10 @@ static void php_sqlite3_object_free_storage(zend_object *object) /* {{{ */
21932190
func = intern->funcs;
21942191
intern->funcs = func->next;
21952192
if (intern->initialised && intern->db) {
2196-
sqlite3_create_function(intern->db, func->func_name, func->argc, SQLITE_UTF8, func, NULL, NULL, NULL);
2193+
sqlite3_create_function(intern->db, ZSTR_VAL(func->func_name), func->argc, SQLITE_UTF8, func, NULL, NULL, NULL);
21972194
}
21982195

2199-
efree((char*)func->func_name);
2196+
zend_string_release(func->func_name);
22002197

22012198
if (ZEND_FCC_INITIALIZED(func->func)) {
22022199
zend_fcc_dtor(&func->func);
@@ -2214,9 +2211,9 @@ static void php_sqlite3_object_free_storage(zend_object *object) /* {{{ */
22142211
collation = intern->collations;
22152212
intern->collations = collation->next;
22162213
if (intern->initialised && intern->db){
2217-
sqlite3_create_collation(intern->db, collation->collation_name, SQLITE_UTF8, NULL, NULL);
2214+
sqlite3_create_collation(intern->db, ZSTR_VAL(collation->collation_name), SQLITE_UTF8, NULL, NULL);
22182215
}
2219-
efree((char*)collation->collation_name);
2216+
zend_string_release(collation->collation_name);
22202217
if (ZEND_FCC_INITIALIZED(collation->cmp_func)) {
22212218
zend_fcc_dtor(&collation->cmp_func);
22222219
}

0 commit comments

Comments
 (0)