Commit a0d743ca174 for php.net

commit a0d743ca174fe5e0b64ecae27682acf03bd96eae
Author: Frediano Ziglio <freddy77@gmail.com>
Date:   Thu Apr 9 03:34:04 2026 +0100

    ext/pdo_dblib: Added dblib_handle_check_liveness handler (#21681)

    Closes #21681

    In case of persistent connection it was not checked if the
    connection was still alive always assuming it was.
    If the connection was broken this caused PHP to reuse the
    broken connection over and over.
    dbdead function is supported by all dblib implementation
    (MS, Sybase, FreeTDS).
    Change tested manually, see
    https://github.com/FreeTDS/freetds/issues/711#issuecomment-4211772091

    Signed-off-by: Frediano Ziglio <freddy77@gmail.com>

diff --git a/NEWS b/NEWS
index fd17715973a..45524b382c7 100644
--- a/NEWS
+++ b/NEWS
@@ -99,6 +99,9 @@ PHP                                                                        NEWS
   . Added TLS session resumption support for streams with new context options
     and Openssl\Session class. (Jakub Zelenka)

+- PDO_DBLIB;
+  . Added dblib_handle_check_liveness handler. (freddy77)
+
 - PDO_PGSQL:
   . Clear session-local state disconnect-equivalent processing.
     (KentarouTakeda)
diff --git a/UPGRADING b/UPGRADING
index 088f5b620bd..fa10bd149f0 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -204,6 +204,10 @@ PHP 8.6 UPGRADE NOTES
   . Output of openssl_x509_parse() contains criticalExtensions listing all
     critical certificate extensions.

+- PDO_DBLIB:
+  . When using persistent connections, there is now a liveness check in the
+  constructor.
+
 - Phar:
   . Phar::mungServer() now supports reference values.

diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c
index 42ba72b40ed..9f590c9071b 100644
--- a/ext/pdo_dblib/dblib_driver.c
+++ b/ext/pdo_dblib/dblib_driver.c
@@ -420,6 +420,17 @@ static int dblib_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_valu
 	return 1;
 }

+static zend_result dblib_handle_check_liveness(pdo_dbh_t *dbh)
+{
+	pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
+
+	if (dbdead(H->link)) {
+		return FAILURE;
+	}
+
+	return SUCCESS;
+}
+
 static const struct pdo_dbh_methods dblib_methods = {
 	dblib_handle_closer,
 	dblib_handle_preparer,
@@ -432,7 +443,7 @@ static const struct pdo_dbh_methods dblib_methods = {
 	dblib_handle_last_id, /* last insert id */
 	dblib_fetch_error, /* fetch error */
 	dblib_get_attribute, /* get attr */
-	NULL, /* check liveness */
+	dblib_handle_check_liveness, /* check_liveness */
 	NULL, /* get driver methods */
 	NULL, /* request shutdown */
 	NULL, /* in transaction, use PDO's internal tracking mechanism */