Skip to content

Commit b6a9bdf

Browse files
author
Ilia Alshanetsky
committed
Better fix for a possible double free in sqlite_single|array_query() when
a failure occurs between query execution and data retrieval.
1 parent e145ab5 commit b6a9bdf

File tree

1 file changed

+3
-6
lines changed

1 file changed

+3
-6
lines changed

ext/sqlite/sqlite.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,6 +1011,7 @@ void sqlite_query(struct php_sqlite_db *db, char *sql, long sql_len, int mode, i
10111011
if (return_value) {
10121012
RETURN_FALSE;
10131013
} else {
1014+
efree(rres);
10141015
return;
10151016
}
10161017
}
@@ -1021,7 +1022,6 @@ void sqlite_query(struct php_sqlite_db *db, char *sql, long sql_len, int mode, i
10211022
memcpy(rres, &res, sizeof(*rres));
10221023
rres->db = db;
10231024
zend_list_addref(db->rsrc_id);
1024-
10251025

10261026
/* now the result set is ready for stepping: get first row */
10271027
if (php_sqlite_fetch(rres TSRMLS_CC) != SQLITE_OK) {
@@ -1357,10 +1357,7 @@ PHP_FUNCTION(sqlite_array_query)
13571357
rres = (struct php_sqlite_result *)emalloc(sizeof(*rres));
13581358
sqlite_query(db, sql, sql_len, mode, 0, NULL, rres TSRMLS_CC);
13591359
if (db->last_err_code != SQLITE_OK) {
1360-
if(!rres->vm) {
1361-
/* no query happened - it's out responsibility to free it */
1362-
efree(rres);
1363-
}
1360+
/* no need to free rres, as it will be freed by sqlite_query() for us */
13641361
RETURN_FALSE;
13651362
}
13661363

@@ -1465,7 +1462,7 @@ PHP_FUNCTION(sqlite_single_query)
14651462
rres = (struct php_sqlite_result *)emalloc(sizeof(*rres));
14661463
sqlite_query(db, sql, sql_len, PHPSQLITE_NUM, 0, NULL, rres TSRMLS_CC);
14671464
if (db->last_err_code != SQLITE_OK) {
1468-
efree(rres);
1465+
/* no need to free rres, as it will be freed by sqlite_query() for us */
14691466
RETURN_FALSE;
14701467
}
14711468

0 commit comments

Comments
 (0)