Skip to content

Commit 4c80e43

Browse files
committed
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Fix #80460: ODBC doesn't account for SQL_NO_TOTAL indicator
2 parents 606b2c3 + 7f83976 commit 4c80e43

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ PHP NEWS
1212
- FTP:
1313
. Fixed bug #80901 (Info leak in ftp extension). (cmb)
1414

15+
- ODBC:
16+
. Fixed bug #80460 (ODBC doesn't account for SQL_NO_TOTAL indicator). (cmb)
17+
1518
- pgsql:
1619
. Fixed php_pgsql_fd_cast() wrt. php_stream_can_cast(). (cmb)
1720

ext/odbc/php_odbc.c

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1447,6 +1447,9 @@ static void php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type)
14471447
} else if (result->values[i].vallen == SQL_NULL_DATA) {
14481448
ZVAL_NULL(&tmp);
14491449
break;
1450+
} else if (result->values[i].vallen == SQL_NO_TOTAL) {
1451+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", i + 1, rc);
1452+
ZVAL_FALSE(&tmp);
14501453
} else {
14511454
ZVAL_STRINGL(&tmp, buf, result->values[i].vallen);
14521455
}
@@ -1456,6 +1459,10 @@ static void php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type)
14561459
if (result->values[i].vallen == SQL_NULL_DATA) {
14571460
ZVAL_NULL(&tmp);
14581461
break;
1462+
} else if (result->values[i].vallen == SQL_NO_TOTAL) {
1463+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", i + 1, rc);
1464+
ZVAL_FALSE(&tmp);
1465+
break;
14591466
}
14601467
ZVAL_STRINGL(&tmp, result->values[i].value, result->values[i].vallen);
14611468
break;
@@ -1600,6 +1607,9 @@ PHP_FUNCTION(odbc_fetch_into)
16001607
} else if (result->values[i].vallen == SQL_NULL_DATA) {
16011608
ZVAL_NULL(&tmp);
16021609
break;
1610+
} else if (result->values[i].vallen == SQL_NO_TOTAL) {
1611+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", i + 1, rc);
1612+
ZVAL_FALSE(&tmp);
16031613
} else {
16041614
ZVAL_STRINGL(&tmp, buf, result->values[i].vallen);
16051615
}
@@ -1609,6 +1619,10 @@ PHP_FUNCTION(odbc_fetch_into)
16091619
if (result->values[i].vallen == SQL_NULL_DATA) {
16101620
ZVAL_NULL(&tmp);
16111621
break;
1622+
} else if (result->values[i].vallen == SQL_NO_TOTAL) {
1623+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", i + 1, rc);
1624+
ZVAL_FALSE(&tmp);
1625+
break;
16121626
}
16131627
ZVAL_STRINGL(&tmp, result->values[i].value, result->values[i].vallen);
16141628
break;
@@ -1836,6 +1850,10 @@ PHP_FUNCTION(odbc_result)
18361850
} else if (result->values[field_ind].vallen == SQL_NULL_DATA) {
18371851
zend_string_efree(field_str);
18381852
RETURN_NULL();
1853+
} else if (result->values[field_ind].vallen == SQL_NO_TOTAL) {
1854+
zend_string_efree(field_str);
1855+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", field_ind + 1, rc);
1856+
RETURN_FALSE;
18391857
}
18401858
/* Reduce fieldlen by 1 if we have char data. One day we might
18411859
have binary strings... */
@@ -1859,6 +1877,9 @@ PHP_FUNCTION(odbc_result)
18591877
default:
18601878
if (result->values[field_ind].vallen == SQL_NULL_DATA) {
18611879
RETURN_NULL();
1880+
} else if (result->values[field_ind].vallen == SQL_NO_TOTAL) {
1881+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", field_ind + 1, rc);
1882+
RETURN_FALSE;
18621883
} else {
18631884
RETURN_STRINGL(result->values[field_ind].value, result->values[field_ind].vallen);
18641885
}
@@ -1890,6 +1911,10 @@ PHP_FUNCTION(odbc_result)
18901911
if (result->values[field_ind].vallen == SQL_NULL_DATA) {
18911912
efree(field);
18921913
RETURN_NULL();
1914+
} else if (result->values[field_ind].vallen == SQL_NO_TOTAL) {
1915+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%d (driver cannot determine length)", field_ind + 1, rc);
1916+
efree(field);
1917+
RETURN_FALSE;
18931918
}
18941919
/* chop the trailing \0 by outputting only 4095 bytes */
18951920
PHPWRITE(field,(rc == SQL_SUCCESS_WITH_INFO) ? 4095 : result->values[field_ind].vallen);
@@ -1994,7 +2019,14 @@ PHP_FUNCTION(odbc_result_all)
19942019
RETURN_FALSE;
19952020
}
19962021
if (rc == SQL_SUCCESS_WITH_INFO) {
1997-
PHPWRITE(buf, result->longreadlen);
2022+
if (result->values[i].vallen == SQL_NO_TOTAL) {
2023+
php_printf("</td></tr></table>");
2024+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%zu (driver cannot determine length)", i + 1, rc);
2025+
efree(buf);
2026+
RETURN_FALSE;
2027+
} else {
2028+
PHPWRITE(buf, result->longreadlen);
2029+
}
19982030
} else if (rc != SQL_SUCCESS) {
19992031
php_printf("</td></tr></table>");
20002032
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%zu (retcode %u)", i + 1, rc);
@@ -2011,6 +2043,9 @@ PHP_FUNCTION(odbc_result_all)
20112043
default:
20122044
if (result->values[i].vallen == SQL_NULL_DATA) {
20132045
php_printf("<td>NULL</td>");
2046+
} else if (result->values[i].vallen == SQL_NO_TOTAL) {
2047+
php_error_docref(NULL, E_WARNING, "Cannot get data of column #%zu (driver cannot determine length)", i + 1, rc);
2048+
php_printf("<td>FALSE</td>");
20142049
} else {
20152050
php_printf("<td>%s</td>", result->values[i].value);
20162051
}

0 commit comments

Comments
 (0)