Skip to content

Commit 8bbe4b4

Browse files
committed
Merge branch 'PHP-8.5'
* PHP-8.5: sqlite: fix error checks for column retrieval
2 parents 03b148c + 50decba commit 8bbe4b4

1 file changed

Lines changed: 35 additions & 9 deletions

File tree

ext/sqlite3/sqlite3.c

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -604,7 +604,7 @@ PHP_METHOD(SQLite3, query)
604604
}
605605
/* }}} */
606606

607-
static void sqlite_value_to_zval(sqlite3_stmt *stmt, int column, zval *data) /* {{{ */
607+
static void sqlite_value_to_zval(php_sqlite3_db_object *db_obj, sqlite3_stmt *stmt, int column, zval *data) /* {{{ */
608608
{
609609
sqlite3_int64 val;
610610

@@ -613,7 +613,13 @@ static void sqlite_value_to_zval(sqlite3_stmt *stmt, int column, zval *data) /*
613613
val = sqlite3_column_int64(stmt, column);
614614
#if LONG_MAX <= 2147483647
615615
if (val > ZEND_LONG_MAX || val < ZEND_LONG_MIN) {
616-
ZVAL_STRINGL(data, (char *)sqlite3_column_text(stmt, column), sqlite3_column_bytes(stmt, column));
616+
const char *text = (const char *) sqlite3_column_text(stmt, column);
617+
if (UNEXPECTED(text == NULL)) {
618+
php_sqlite3_error(db_obj, SQLITE_NOMEM, "Failed to retrieve column value due to out of memory");
619+
ZVAL_NULL(data);
620+
} else {
621+
ZVAL_STRINGL(data, text, sqlite3_column_bytes(stmt, column));
622+
}
617623
} else {
618624
#endif
619625
ZVAL_LONG(data, (zend_long) val);
@@ -630,13 +636,33 @@ static void sqlite_value_to_zval(sqlite3_stmt *stmt, int column, zval *data) /*
630636
ZVAL_NULL(data);
631637
break;
632638

633-
case SQLITE3_TEXT:
634-
ZVAL_STRINGL(data, (const char *) sqlite3_column_text(stmt, column), sqlite3_column_bytes(stmt, column));
639+
case SQLITE3_TEXT: {
640+
const char *text = (const char *) sqlite3_column_text(stmt, column);
641+
if (UNEXPECTED(text == NULL)) {
642+
php_sqlite3_error(db_obj, SQLITE_NOMEM, "Failed to retrieve column value due to out of memory");
643+
ZVAL_NULL(data);
644+
} else {
645+
ZVAL_STRINGL(data, text, sqlite3_column_bytes(stmt, column));
646+
}
635647
break;
648+
}
636649

637650
case SQLITE_BLOB:
638-
default:
639-
ZVAL_STRINGL(data, (char*)sqlite3_column_blob(stmt, column), sqlite3_column_bytes(stmt, column));
651+
default: {
652+
const char *blob = (const char *) sqlite3_column_blob(stmt, column);
653+
if (UNEXPECTED(blob == NULL)) {
654+
if (sqlite3_errcode(sqlite3_db_handle(stmt)) == SQLITE_NOMEM) {
655+
php_sqlite3_error(db_obj, SQLITE_NOMEM, "Failed to retrieve column value due to out of memory");
656+
ZVAL_NULL(data);
657+
} else {
658+
/* Zero-length BLOB */
659+
ZVAL_EMPTY_STRING(data);
660+
}
661+
} else {
662+
ZVAL_STRINGL(data, blob, sqlite3_column_bytes(stmt, column));
663+
}
664+
break;
665+
}
640666
}
641667
}
642668
/* }}} */
@@ -686,14 +712,14 @@ PHP_METHOD(SQLite3, querySingle)
686712
case SQLITE_ROW: /* Valid Row */
687713
{
688714
if (!entire_row) {
689-
sqlite_value_to_zval(stmt, 0, return_value);
715+
sqlite_value_to_zval(db_obj, stmt, 0, return_value);
690716
} else {
691717
int i = 0, count = sqlite3_data_count(stmt);
692718

693719
array_init_size(return_value, count);
694720
for (i = 0; i < count; i++) {
695721
zval data;
696-
sqlite_value_to_zval(stmt, i, &data);
722+
sqlite_value_to_zval(db_obj, stmt, i, &data);
697723
add_assoc_zval(return_value, (char*)sqlite3_column_name(stmt, i), &data);
698724
}
699725
}
@@ -2447,7 +2473,7 @@ static zend_always_inline void php_sqlite3_fetch_one(int n_cols, php_sqlite3_res
24472473
{
24482474
for (int i = 0; i < n_cols; i ++) {
24492475
zval data;
2450-
sqlite_value_to_zval(result_obj->stmt_obj->stmt, i, &data);
2476+
sqlite_value_to_zval(result_obj->db_obj, result_obj->stmt_obj->stmt, i, &data);
24512477

24522478
if (mode & PHP_SQLITE3_NUM) {
24532479
add_index_zval(result, i, &data);

0 commit comments

Comments
 (0)