From 91418df5480a82fa126148bd5e190a6df75b58f3 Mon Sep 17 00:00:00 2001 From: David Puglielli Date: Tue, 7 Nov 2017 15:04:50 -0800 Subject: [PATCH] Added tests for manual verification --- .../pdo_sqlsrv/pdo_txn_rollback_crash.phpt | 82 +++++++++++++++++++ .../sqlsrv/sqlsrv_txn_rollback_crash.phpt | 82 +++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 test/functional/pdo_sqlsrv/pdo_txn_rollback_crash.phpt create mode 100644 test/functional/sqlsrv/sqlsrv_txn_rollback_crash.phpt diff --git a/test/functional/pdo_sqlsrv/pdo_txn_rollback_crash.phpt b/test/functional/pdo_sqlsrv/pdo_txn_rollback_crash.phpt new file mode 100644 index 00000000..01a4dc9b --- /dev/null +++ b/test/functional/pdo_sqlsrv/pdo_txn_rollback_crash.phpt @@ -0,0 +1,82 @@ +--TEST-- +Checks that calling query() after beginTransaction() with an invalid query does not cause a crash. Fix for Github 434. +--DESCRIPTION-- +Calling beginTransaction() and then query() with an invalid query can cause a crash in php.exe or php-cgi.exe, +which may manifest as a CLI crash or produce an error message saying "Faulting Module[...]odbc32.dll". The +cause is an attempt to double free a statement handle after script execution which had not been properly freed +during rollback. This test tells us nothing under run-tests.php because the crash only occurs at the end of +script execution, so any expected output already exists and the test would pass. Therefore manual verification +is necessary - this test should be run separately to verify no crash occurs. +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); + + for ($i = 0; $i < 50; $i++) { + echo "Iteration $i\n"; + if ($conn->beginTransaction()) { + $stmt = $conn->query('SELECT fakecolumn FROM faketable'); + } + $conn->commit(); + } + + $conn = null; + + echo "Done.\n"; +?> +--EXPECT-- +Iteration 0 +Iteration 1 +Iteration 2 +Iteration 3 +Iteration 4 +Iteration 5 +Iteration 6 +Iteration 7 +Iteration 8 +Iteration 9 +Iteration 10 +Iteration 11 +Iteration 12 +Iteration 13 +Iteration 14 +Iteration 15 +Iteration 16 +Iteration 17 +Iteration 18 +Iteration 19 +Iteration 20 +Iteration 21 +Iteration 22 +Iteration 23 +Iteration 24 +Iteration 25 +Iteration 26 +Iteration 27 +Iteration 28 +Iteration 29 +Iteration 30 +Iteration 31 +Iteration 32 +Iteration 33 +Iteration 34 +Iteration 35 +Iteration 36 +Iteration 37 +Iteration 38 +Iteration 39 +Iteration 40 +Iteration 41 +Iteration 42 +Iteration 43 +Iteration 44 +Iteration 45 +Iteration 46 +Iteration 47 +Iteration 48 +Iteration 49 +Done. \ No newline at end of file diff --git a/test/functional/sqlsrv/sqlsrv_txn_rollback_crash.phpt b/test/functional/sqlsrv/sqlsrv_txn_rollback_crash.phpt new file mode 100644 index 00000000..69838015 --- /dev/null +++ b/test/functional/sqlsrv/sqlsrv_txn_rollback_crash.phpt @@ -0,0 +1,82 @@ +--TEST-- +Checks that calling sqlsrv_query() after sqlsrv_begin_transaction() with an invalid query does not cause a crash. +--DESCRIPTION-- +In PDO_SQLSRV, calling beginTransaction() and then query() with an invalid query can cause a crash in php.exe or +php-cgi.exe, which may manifest as a CLI crash or produce an error message saying "Faulting Module[...]odbc32.dll". +The equivalent sequence of operations in SQLSRV is not known to crash - this test is for verification. This test +tells us nothing under run-tests.php because the crash only occurs at the end of script execution, so any expected +output already exists and the test would pass. Therefore manual verification is necessary - this test should be run +separately to verify no crash occurs. +--SKIPIF-- + +--FILE-- +"$databaseName", "UID"=>"$uid", "PWD"=>"$pwd"); + + $conn = sqlsrv_connect($server, $connOptions); + + for ($i = 0; $i < 50; $i++) { + echo "Iteration $i\n"; + if (sqlsrv_begin_transaction($conn)) { + $stmt = sqlsrv_query($conn, 'SELECT fakecolumn FROM faketable'); + } + sqlsrv_commit($conn); + } + + sqlsrv_close($conn); + + echo "Done.\n"; +?> +--EXPECT-- +Iteration 0 +Iteration 1 +Iteration 2 +Iteration 3 +Iteration 4 +Iteration 5 +Iteration 6 +Iteration 7 +Iteration 8 +Iteration 9 +Iteration 10 +Iteration 11 +Iteration 12 +Iteration 13 +Iteration 14 +Iteration 15 +Iteration 16 +Iteration 17 +Iteration 18 +Iteration 19 +Iteration 20 +Iteration 21 +Iteration 22 +Iteration 23 +Iteration 24 +Iteration 25 +Iteration 26 +Iteration 27 +Iteration 28 +Iteration 29 +Iteration 30 +Iteration 31 +Iteration 32 +Iteration 33 +Iteration 34 +Iteration 35 +Iteration 36 +Iteration 37 +Iteration 38 +Iteration 39 +Iteration 40 +Iteration 41 +Iteration 42 +Iteration 43 +Iteration 44 +Iteration 45 +Iteration 46 +Iteration 47 +Iteration 48 +Iteration 49 +Done. \ No newline at end of file