mirror of
https://github.com/postgres/postgres.git
synced 2025-06-22 02:52:08 +03:00
Simplify the way OpenSSL renegotiation is initiated in server.
At least in all modern versions of OpenSSL, it is enough to call SSL_renegotiate() once, and then forget about it. Subsequent SSL_write() and SSL_read() calls will finish the handshake. The SSL_set_session_id_context() call is unnecessary too. We only have one SSL context, and the SSL session was created with that to begin with.
This commit is contained in:
@ -624,33 +624,10 @@ be_tls_write(Port *port, void *ptr, size_t len)
|
||||
*/
|
||||
SSL_clear_num_renegotiations(port->ssl);
|
||||
|
||||
SSL_set_session_id_context(port->ssl, (void *) &SSL_context,
|
||||
sizeof(SSL_context));
|
||||
if (SSL_renegotiate(port->ssl) <= 0)
|
||||
ereport(COMMERROR,
|
||||
(errcode(ERRCODE_PROTOCOL_VIOLATION),
|
||||
errmsg("SSL failure during renegotiation start")));
|
||||
else
|
||||
{
|
||||
int retries;
|
||||
|
||||
/*
|
||||
* A handshake can fail, so be prepared to retry it, but only
|
||||
* a few times.
|
||||
*/
|
||||
for (retries = 0;; retries++)
|
||||
{
|
||||
if (SSL_do_handshake(port->ssl) > 0)
|
||||
break; /* done */
|
||||
ereport(COMMERROR,
|
||||
(errcode(ERRCODE_PROTOCOL_VIOLATION),
|
||||
errmsg("SSL handshake failure on renegotiation, retrying")));
|
||||
if (retries >= 20)
|
||||
ereport(FATAL,
|
||||
(errcode(ERRCODE_PROTOCOL_VIOLATION),
|
||||
errmsg("could not complete SSL handshake on renegotiation, too many failures")));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wloop:
|
||||
|
Reference in New Issue
Block a user