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