@@ -670,6 +670,7 @@ void odbc_bindcols(odbc_result *result)
670670
671671 for (i = 0 ; i < result -> numcols ; i ++ ) {
672672 bool char_extra_alloc = false;
673+ result -> values [i ].value_max_len = 0 ;
673674 colfieldid = SQL_COLUMN_DISPLAY_SIZE ;
674675
675676 rc = SQLColAttribute (result -> stmt , (SQLUSMALLINT )(i + 1 ), SQL_DESC_NAME ,
@@ -749,6 +750,7 @@ void odbc_bindcols(odbc_result *result)
749750 displaysize *= 4 ;
750751 }
751752 result -> values [i ].value = (char * )emalloc (displaysize + 1 );
753+ result -> values [i ].value_max_len = displaysize ;
752754 rc = SQLBindCol (result -> stmt , (SQLUSMALLINT )(i + 1 ), SQL_C_CHAR , result -> values [i ].value ,
753755 displaysize + 1 , & result -> values [i ].vallen );
754756 break ;
@@ -1420,7 +1422,11 @@ static void php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type)
14201422 ZVAL_FALSE (& tmp );
14211423 break ;
14221424 }
1423- ZVAL_STRINGL (& tmp , result -> values [i ].value , result -> values [i ].vallen );
1425+ SQLLEN str_len = result -> values [i ].vallen ;
1426+ if (str_len > result -> values [i ].value_max_len ) {
1427+ str_len = result -> values [i ].value_max_len ;
1428+ }
1429+ ZVAL_STRINGL (& tmp , result -> values [i ].value , str_len );
14241430 break ;
14251431 }
14261432
@@ -1570,7 +1576,11 @@ PHP_FUNCTION(odbc_fetch_into)
15701576 ZVAL_FALSE (& tmp );
15711577 break ;
15721578 }
1573- ZVAL_STRINGL (& tmp , result -> values [i ].value , result -> values [i ].vallen );
1579+ SQLLEN str_len = result -> values [i ].vallen ;
1580+ if (str_len > result -> values [i ].value_max_len ) {
1581+ str_len = result -> values [i ].value_max_len ;
1582+ }
1583+ ZVAL_STRINGL (& tmp , result -> values [i ].value , str_len );
15741584 break ;
15751585 }
15761586 zend_hash_index_update (Z_ARRVAL_P (pv_res_arr ), i , & tmp );
@@ -1793,7 +1803,11 @@ PHP_FUNCTION(odbc_result)
17931803 php_error_docref (NULL , E_WARNING , "Cannot get data of column #%d (driver cannot determine length)" , field_ind + 1 );
17941804 RETURN_FALSE ;
17951805 } else {
1796- RETURN_STRINGL (result -> values [field_ind ].value , result -> values [field_ind ].vallen );
1806+ SQLLEN str_len = result -> values [field_ind ].vallen ;
1807+ if (str_len > result -> values [field_ind ].value_max_len ) {
1808+ str_len = result -> values [field_ind ].value_max_len ;
1809+ }
1810+ RETURN_STRINGL (result -> values [field_ind ].value , str_len );
17971811 }
17981812 break ;
17991813 }
0 commit comments