]> granicus.if.org Git - php/commit
Fix #79038: PDOStatement::nextRowset() leaks column values
authorChristoph M. Becker <cmbecker69@gmx.de>
Fri, 27 Dec 2019 12:20:11 +0000 (13:20 +0100)
committerChristoph M. Becker <cmbecker69@gmx.de>
Mon, 17 Feb 2020 21:53:02 +0000 (22:53 +0100)
commit08073b06581c6dc9234cfb2e9b187a598154c8ab
tree01422c7c3a6418e3abb0dd835c5d95fd42b8e9db
parent16c7c716937f7cd5bfae19063772898dd8644de3
Fix #79038: PDOStatement::nextRowset() leaks column values

Firstly, we must not rely on `stmt->column_count` when freeing the
driver specific column values, but rather store the column count in
the driver data.  Since the column count is a `short`, 16 bit are
sufficient, so we can store it in reserved bits of `pdo_odbc_stmt`.

Furthermore, we must not allocate new column value storage when the
statement is not executed, but rather when the column value storage has
not been allocated.

Finally, we have to introduce a driver specific `cursor_closer` to
avoid that `::closeCursor()` calls `odbc_stmt_next_rowset()` which then
frees the column value storage, because it may be still needed for
bound columns.
NEWS
ext/pdo_odbc/odbc_stmt.c
ext/pdo_odbc/php_pdo_odbc_int.h