Skip to content

Commit 7be5e78

Browse files
committed
Merge branch 'PHP-8.0'
* PHP-8.0: Fix #80460: ODBC doesn't account for SQL_NO_TOTAL indicator
2 parents 9b59f93 + 4c80e43 commit 7be5e78

File tree

1 file changed

+36
-1
lines changed

1 file changed

+36
-1
lines changed

ext/odbc/php_odbc.c

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1450,6 +1450,9 @@ static void php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type)
14501450
} else if (result->values[i].vallen == SQL_NULL_DATA) {
14511451
ZVAL_NULL(&tmp);
14521452
break;
1453+
} else if (result->values[i].vallen == SQL_NO_TOTAL) {
1454+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", i + 1, rc);
1455+
ZVAL_FALSE(&tmp);
14531456
} else {
14541457
ZVAL_STRINGL(&tmp, buf, result->values[i].vallen);
14551458
}
@@ -1459,6 +1462,10 @@ static void php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type)
14591462
if (result->values[i].vallen == SQL_NULL_DATA) {
14601463
ZVAL_NULL(&tmp);
14611464
break;
1465+
} else if (result->values[i].vallen == SQL_NO_TOTAL) {
1466+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", i + 1, rc);
1467+
ZVAL_FALSE(&tmp);
1468+
break;
14621469
}
14631470
ZVAL_STRINGL(&tmp, result->values[i].value, result->values[i].vallen);
14641471
break;
@@ -1605,6 +1612,9 @@ PHP_FUNCTION(odbc_fetch_into)
16051612
} else if (result->values[i].vallen == SQL_NULL_DATA) {
16061613
ZVAL_NULL(&tmp);
16071614
break;
1615+
} else if (result->values[i].vallen == SQL_NO_TOTAL) {
1616+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", i + 1, rc);
1617+
ZVAL_FALSE(&tmp);
16081618
} else {
16091619
ZVAL_STRINGL(&tmp, buf, result->values[i].vallen);
16101620
}
@@ -1614,6 +1624,10 @@ PHP_FUNCTION(odbc_fetch_into)
16141624
if (result->values[i].vallen == SQL_NULL_DATA) {
16151625
ZVAL_NULL(&tmp);
16161626
break;
1627+
} else if (result->values[i].vallen == SQL_NO_TOTAL) {
1628+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", i + 1, rc);
1629+
ZVAL_FALSE(&tmp);
1630+
break;
16171631
}
16181632
ZVAL_STRINGL(&tmp, result->values[i].value, result->values[i].vallen);
16191633
break;
@@ -1844,6 +1858,10 @@ PHP_FUNCTION(odbc_result)
18441858
} else if (result->values[field_ind].vallen == SQL_NULL_DATA) {
18451859
zend_string_efree(field_str);
18461860
RETURN_NULL();
1861+
} else if (result->values[field_ind].vallen == SQL_NO_TOTAL) {
1862+
zend_string_efree(field_str);
1863+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", field_ind + 1, rc);
1864+
RETURN_FALSE;
18471865
}
18481866
/* Reduce fieldlen by 1 if we have char data. One day we might
18491867
have binary strings... */
@@ -1867,6 +1885,9 @@ PHP_FUNCTION(odbc_result)
18671885
default:
18681886
if (result->values[field_ind].vallen == SQL_NULL_DATA) {
18691887
RETURN_NULL();
1888+
} else if (result->values[field_ind].vallen == SQL_NO_TOTAL) {
1889+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", field_ind + 1, rc);
1890+
RETURN_FALSE;
18701891
} else {
18711892
RETURN_STRINGL(result->values[field_ind].value, result->values[field_ind].vallen);
18721893
}
@@ -1898,6 +1919,10 @@ PHP_FUNCTION(odbc_result)
18981919
if (result->values[field_ind].vallen == SQL_NULL_DATA) {
18991920
efree(field);
19001921
RETURN_NULL();
1922+
} else if (result->values[field_ind].vallen == SQL_NO_TOTAL) {
1923+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", field_ind + 1, rc);
1924+
efree(field);
1925+
RETURN_FALSE;
19011926
}
19021927
/* chop the trailing \0 by outputting only 4095 bytes */
19031928
PHPWRITE(field,(rc == SQL_SUCCESS_WITH_INFO) ? 4095 : result->values[field_ind].vallen);
@@ -2005,7 +2030,14 @@ PHP_FUNCTION(odbc_result_all)
20052030
RETURN_FALSE;
20062031
}
20072032
if (rc == SQL_SUCCESS_WITH_INFO) {
2008-
PHPWRITE(buf, result->longreadlen);
2033+
if (result->values[i].vallen == SQL_NO_TOTAL) {
2034+
php_printf("</td></tr></table>");
2035+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%zu (driver cannot determine length)", i + 1, rc);
2036+
efree(buf);
2037+
RETURN_FALSE;
2038+
} else {
2039+
PHPWRITE(buf, result->longreadlen);
2040+
}
20092041
} else if (rc != SQL_SUCCESS) {
20102042
php_printf("</td></tr></table>");
20112043
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%zu (retcode %u)", i + 1, rc);
@@ -2022,6 +2054,9 @@ PHP_FUNCTION(odbc_result_all)
20222054
default:
20232055
if (result->values[i].vallen == SQL_NULL_DATA) {
20242056
php_printf("<td>NULL</td>");
2057+
} else if (result->values[i].vallen == SQL_NO_TOTAL) {
2058+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%zu (driver cannot determine length)", i + 1, rc);
2059+
php_printf("<td>FALSE</td>");
20252060
} else {
20262061
php_printf("<td>%s</td>", result->values[i].value);
20272062
}

0 commit comments

Comments
 (0)