Skip to content

Fix GH-22667: pdo_odbc heap over-read on oversized column value#148

Closed
iliaal wants to merge 1 commit into
PHP-8.4from
fix/gh-22667-pdo-odbc-clamp
Closed

Fix GH-22667: pdo_odbc heap over-read on oversized column value#148
iliaal wants to merge 1 commit into
PHP-8.4from
fix/gh-22667-pdo-odbc-clamp

Conversation

@iliaal

@iliaal iliaal commented Jul 10, 2026

Copy link
Copy Markdown
Owner

ext/pdo_odbc builds the result string from the driver-reported fetched_len, which on truncation exceeds the bound colsize+1 buffer (SQL_SUCCESS_WITH_INFO), over-reading heap into the returned value. Clamps to the bound capacity for short-bound columns only, so long columns are unaffected. Reproduces with the SQLite3 ODBC driver; the test skips without it. Sibling of phpGH-22668.

odbc_stmt_describe() binds a colsize+1 buffer for short columns and stores
that capacity in datalen, but odbc_stmt_get_col() built the result string
from the driver-reported fetched_len. A conforming driver truncates an
over-long value into the buffer yet reports the full length, so
ZVAL_STRINGL_FAST over-read past the allocation and returned adjacent heap to
userland. Clamp fetched_len to the bound capacity, guarded by !is_long so the
long-column SQLGetData path (whose fixed buffer is unrelated to datalen) is
left untouched.

Fixes phpGH-22667
@iliaal

iliaal commented Jul 10, 2026

Copy link
Copy Markdown
Owner Author

Submitted upstream as php#22672.

@iliaal iliaal closed this Jul 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant