@@ -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