Skip to content

Commit 50decba

Browse files
committed
Merge branch 'PHP-8.4' into PHP-8.5
* PHP-8.4: sqlite: fix error checks for column retrieval
2 parents 00d7f85 + 407c45d commit 50decba

2 files changed

Lines changed: 38 additions & 9 deletions

File tree

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ PHP NEWS
3434
. Fixed bug GH-22218 (SoapServer::handle() crash on $_SERVER not being
3535
an array). (David Carlier / Rex-Reynolds)
3636

37+
- Sqlite:
38+
. Fix error checks for column retrieval. (ndossche)
39+
3740
- Zlib:
3841
. Fixed memory leak if deflate initialization fails and there is a dict.
3942
(ndossche)

ext/sqlite3/sqlite3.c

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,7 @@ PHP_METHOD(SQLite3, query)
621621
}
622622
/* }}} */
623623

624-
static void sqlite_value_to_zval(sqlite3_stmt *stmt, int column, zval *data) /* {{{ */
624+
static void sqlite_value_to_zval(php_sqlite3_db_object *db_obj, sqlite3_stmt *stmt, int column, zval *data) /* {{{ */
625625
{
626626
sqlite3_int64 val;
627627

@@ -630,7 +630,13 @@ static void sqlite_value_to_zval(sqlite3_stmt *stmt, int column, zval *data) /*
630630
val = sqlite3_column_int64(stmt, column);
631631
#if LONG_MAX <= 2147483647
632632
if (val > ZEND_LONG_MAX || val < ZEND_LONG_MIN) {
633-
ZVAL_STRINGL(data, (char *)sqlite3_column_text(stmt, column), sqlite3_column_bytes(stmt, column));
633+
const char *text = (const char *) sqlite3_column_text(stmt, column);
634+
if (UNEXPECTED(text == NULL)) {
635+
php_sqlite3_error(db_obj, SQLITE_NOMEM, "Failed to retrieve column value due to out of memory");
636+
ZVAL_NULL(data);
637+
} else {
638+
ZVAL_STRINGL(data, text, sqlite3_column_bytes(stmt, column));
639+
}
634640
} else {
635641
#endif
636642
ZVAL_LONG(data, (zend_long) val);
@@ -647,13 +653,33 @@ static void sqlite_value_to_zval(sqlite3_stmt *stmt, int column, zval *data) /*
647653
ZVAL_NULL(data);
648654
break;
649655

650-
case SQLITE3_TEXT:
651-
ZVAL_STRING(data, (char*)sqlite3_column_text(stmt, column));
656+
case SQLITE3_TEXT: {
657+
const char *text = (const char *) sqlite3_column_text(stmt, column);
658+
if (UNEXPECTED(text == NULL)) {
659+
php_sqlite3_error(db_obj, SQLITE_NOMEM, "Failed to retrieve column value due to out of memory");
660+
ZVAL_NULL(data);
661+
} else {
662+
ZVAL_STRING(data, text);
663+
}
652664
break;
665+
}
653666

654667
case SQLITE_BLOB:
655-
default:
656-
ZVAL_STRINGL(data, (char*)sqlite3_column_blob(stmt, column), sqlite3_column_bytes(stmt, column));
668+
default: {
669+
const char *blob = (const char *) sqlite3_column_blob(stmt, column);
670+
if (UNEXPECTED(blob == NULL)) {
671+
if (sqlite3_errcode(sqlite3_db_handle(stmt)) == SQLITE_NOMEM) {
672+
php_sqlite3_error(db_obj, SQLITE_NOMEM, "Failed to retrieve column value due to out of memory");
673+
ZVAL_NULL(data);
674+
} else {
675+
/* Zero-length BLOB */
676+
ZVAL_EMPTY_STRING(data);
677+
}
678+
} else {
679+
ZVAL_STRINGL(data, blob, sqlite3_column_bytes(stmt, column));
680+
}
681+
break;
682+
}
657683
}
658684
}
659685
/* }}} */
@@ -703,14 +729,14 @@ PHP_METHOD(SQLite3, querySingle)
703729
case SQLITE_ROW: /* Valid Row */
704730
{
705731
if (!entire_row) {
706-
sqlite_value_to_zval(stmt, 0, return_value);
732+
sqlite_value_to_zval(db_obj, stmt, 0, return_value);
707733
} else {
708734
int i = 0, count = sqlite3_data_count(stmt);
709735

710736
array_init_size(return_value, count);
711737
for (i = 0; i < count; i++) {
712738
zval data;
713-
sqlite_value_to_zval(stmt, i, &data);
739+
sqlite_value_to_zval(db_obj, stmt, i, &data);
714740
add_assoc_zval(return_value, (char*)sqlite3_column_name(stmt, i), &data);
715741
}
716742
}
@@ -2471,7 +2497,7 @@ static zend_always_inline void php_sqlite3_fetch_one(int n_cols, php_sqlite3_res
24712497
{
24722498
for (int i = 0; i < n_cols; i ++) {
24732499
zval data;
2474-
sqlite_value_to_zval(result_obj->stmt_obj->stmt, i, &data);
2500+
sqlite_value_to_zval(result_obj->db_obj, result_obj->stmt_obj->stmt, i, &data);
24752501

24762502
if (mode & PHP_SQLITE3_NUM) {
24772503
add_index_zval(result, i, &data);

0 commit comments

Comments
 (0)