@@ -661,6 +661,7 @@ void odbc_bindcols(odbc_result *result)
661661
662662 for (i = 0 ; i < result -> numcols ; i ++ ) {
663663 bool char_extra_alloc = false;
664+ result -> values [i ].value_max_len = 0 ;
664665 colfieldid = SQL_COLUMN_DISPLAY_SIZE ;
665666
666667 rc = SQLColAttribute (result -> stmt , (SQLUSMALLINT )(i + 1 ), SQL_DESC_NAME ,
@@ -740,6 +741,7 @@ void odbc_bindcols(odbc_result *result)
740741 displaysize *= 4 ;
741742 }
742743 result -> values [i ].value = (char * )emalloc (displaysize + 1 );
744+ result -> values [i ].value_max_len = displaysize ;
743745 rc = SQLBindCol (result -> stmt , (SQLUSMALLINT )(i + 1 ), SQL_C_CHAR , result -> values [i ].value ,
744746 displaysize + 1 , & result -> values [i ].vallen );
745747 break ;
@@ -1458,7 +1460,11 @@ static void php_odbc_fetch(INTERNAL_FUNCTION_PARAMETERS, bool return_array, php_
14581460 ZVAL_FALSE (& tmp );
14591461 break ;
14601462 }
1461- ZVAL_STRINGL (& tmp , result -> values [i ].value , result -> values [i ].vallen );
1463+ SQLLEN str_len = result -> values [i ].vallen ;
1464+ if (str_len > result -> values [i ].value_max_len ) {
1465+ str_len = result -> values [i ].value_max_len ;
1466+ }
1467+ ZVAL_STRINGL (& tmp , result -> values [i ].value , str_len );
14621468 break ;
14631469 }
14641470
@@ -1671,7 +1677,11 @@ PHP_FUNCTION(odbc_result)
16711677 php_error_docref (NULL , E_WARNING , "Cannot get data of column #%d (driver cannot determine length)" , field_ind + 1 );
16721678 RETURN_FALSE ;
16731679 } else {
1674- RETURN_STRINGL (result -> values [field_ind ].value , result -> values [field_ind ].vallen );
1680+ SQLLEN str_len = result -> values [field_ind ].vallen ;
1681+ if (str_len > result -> values [field_ind ].value_max_len ) {
1682+ str_len = result -> values [field_ind ].value_max_len ;
1683+ }
1684+ RETURN_STRINGL (result -> values [field_ind ].value , str_len );
16751685 }
16761686 break ;
16771687 }
0 commit comments