Bug #78980 [Opn->Csd]: pgsqlGetNotify() overlooks dead connection

From: Date: Fri, 20 Dec 2019 10:46:08 +0000
Subject: Bug #78980 [Opn->Csd]: pgsqlGetNotify() overlooks dead connection
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-224440@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=78980&edit=1 ID: 78980 Updated by: nikic@php.net Reported by: kentaro at ranvis dot com Summary: pgsqlGetNotify() overlooks dead connection -Status: Open +Status: Closed Type: Bug Package: PDO PgSQL PHP Version: master-Git-2019-12-17 (Git) Block user comment: N Private report: N New Comment: Automatic comment on behalf of kentaro@ranvis.com Revision: http://git.php.net/?p=php-src.git;a=commit;h=7e39e6934d7eb3f480a467de7d9fbca608fc1e94 Log: Fix #78980: pgsqlGetNotify() overlooks dead connection Previous Comments: ------------------------------------------------------------------------ [2019-12-17 17:27:33] kentaro at ranvis dot com The following pull request has been associated: Patch Name: Fix #78980: pgsqlGetNotify() overlooks dead connection On GitHub: https://github.com/php/php-src/pull/5020 Patch: https://github.com/php/php-src/pull/5020.patch ------------------------------------------------------------------------ [2019-12-17 17:21:44] kentaro at ranvis dot com Description: ------------ pgsqlGetNotify() doesn't check the result of PQconsumeInput(), which returns 0 on error. If a caller is pooling by calling pgsqlGetNotify(), it will never have a chance to known when the connection is lost. (will add a PR) Test script: --------------- <?php $connArgs = ['pgsql:dbname=DB_NAME', 'USER', 'PASSWORD', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ]]; $pdo = new PDO(...$connArgs); $pdo->exec('listen "test-event"'); var_dump($pdo->pgsqlGetNotify(PDO::FETCH_NUM, 1000)); sleep(15); // kill the DB connection here //system('sudo systemctl restart postgresql-12'); //system('net stop postgresql-x64-12 && net start postgresql-x64-12'); var_dump($pdo->pgsqlGetNotify(PDO::FETCH_NUM, 1000)); // should throw but doesn't var_dump($pdo->query('select 1')); // throws Expected result: ---------------- throws on $pdo->pgsqlGetNotify() Actual result: -------------- throws after $pdo->pgsqlGetNotify(), on $pdo->query('select 1') ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=78980&edit=1

« previous php.bugs (#224440) next »