mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
On further testing, PQping also needs an explicit check for AUTH_REQ.
The pg_fe_sendauth code might fail if it can't handle the authentication request message type --- if so, ping should still say the server is up.
This commit is contained in:
@ -2321,6 +2321,8 @@ keep_going: /* We will come back to here until there is
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* It is an authentication request. */
|
/* It is an authentication request. */
|
||||||
|
conn->auth_req_received = true;
|
||||||
|
|
||||||
/* Get the type of request. */
|
/* Get the type of request. */
|
||||||
if (pqGetInt((int *) &areq, 4, conn))
|
if (pqGetInt((int *) &areq, 4, conn))
|
||||||
{
|
{
|
||||||
@ -2589,11 +2591,18 @@ internal_ping(PGconn *conn)
|
|||||||
return PQPING_OK;
|
return PQPING_OK;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Here is the interesting part of "ping": determine the cause of the
|
* Here begins the interesting part of "ping": determine the cause of the
|
||||||
* failure in sufficient detail to decide what to return. We do not want
|
* failure in sufficient detail to decide what to return. We do not want
|
||||||
* to report that the server is not up just because we didn't have a valid
|
* to report that the server is not up just because we didn't have a valid
|
||||||
* password, for example.
|
* password, for example. In fact, any sort of authentication request
|
||||||
*
|
* implies the server is up. (We need this check since the libpq side
|
||||||
|
* of things might have pulled the plug on the connection before getting
|
||||||
|
* an error as such from the postmaster.)
|
||||||
|
*/
|
||||||
|
if (conn->auth_req_received)
|
||||||
|
return PQPING_OK;
|
||||||
|
|
||||||
|
/*
|
||||||
* If we failed to get any ERROR response from the postmaster, report
|
* If we failed to get any ERROR response from the postmaster, report
|
||||||
* PQPING_NO_RESPONSE. This result could be somewhat misleading for a
|
* PQPING_NO_RESPONSE. This result could be somewhat misleading for a
|
||||||
* pre-7.4 server, since it won't send back a SQLSTATE, but those are long
|
* pre-7.4 server, since it won't send back a SQLSTATE, but those are long
|
||||||
@ -2672,6 +2681,7 @@ makeEmptyPGconn(void)
|
|||||||
conn->std_strings = false; /* unless server says differently */
|
conn->std_strings = false; /* unless server says differently */
|
||||||
conn->verbosity = PQERRORS_DEFAULT;
|
conn->verbosity = PQERRORS_DEFAULT;
|
||||||
conn->sock = -1;
|
conn->sock = -1;
|
||||||
|
conn->auth_req_received = false;
|
||||||
conn->password_needed = false;
|
conn->password_needed = false;
|
||||||
conn->dot_pgpass_used = false;
|
conn->dot_pgpass_used = false;
|
||||||
#ifdef USE_SSL
|
#ifdef USE_SSL
|
||||||
|
@ -349,6 +349,7 @@ struct pg_conn
|
|||||||
SockAddr raddr; /* Remote address */
|
SockAddr raddr; /* Remote address */
|
||||||
ProtocolVersion pversion; /* FE/BE protocol version in use */
|
ProtocolVersion pversion; /* FE/BE protocol version in use */
|
||||||
int sversion; /* server version, e.g. 70401 for 7.4.1 */
|
int sversion; /* server version, e.g. 70401 for 7.4.1 */
|
||||||
|
bool auth_req_received; /* true if any type of auth req received */
|
||||||
bool password_needed; /* true if server demanded a password */
|
bool password_needed; /* true if server demanded a password */
|
||||||
bool dot_pgpass_used; /* true if used .pgpass */
|
bool dot_pgpass_used; /* true if used .pgpass */
|
||||||
bool sigpipe_so; /* have we masked SIGPIPE via SO_NOSIGPIPE? */
|
bool sigpipe_so; /* have we masked SIGPIPE via SO_NOSIGPIPE? */
|
||||||
|
Reference in New Issue
Block a user