php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #78980 pgsqlGetNotify() overlooks dead connection
Submitted: 2019-12-17 17:21 UTC Modified: -
From: kentaro at ranvis dot com Assigned:
Status: Closed Package: PDO PgSQL
PHP Version: master-Git-2019-12-17 (Git) OS:
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If this is not your bug, you can add a comment by following this link.
If this is your bug, but you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: kentaro at ranvis dot com
New email:
PHP Version: OS:

 

 [2019-12-17 17:21 UTC] 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')

Patches

Add a Patch

Pull Requests

Pull requests:

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2019-12-17 17:27 UTC] 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-20 10:46 UTC] nikic@php.net
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
 [2019-12-20 10:46 UTC] nikic@php.net
-Status: Open +Status: Closed
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Apr 20 05:01:27 2024 UTC