mirror of
https://github.com/postgres/postgres.git
synced 2025-07-23 03:21:12 +03:00
Don't allow immediate interrupts during authentication anymore.
We used to handle authentication_timeout by setting ImmediateInterruptOK to true during large parts of the authentication phase of a new connection. While that happens to work acceptably in practice, it's not particularly nice and has ugly corner cases. Previous commits converted the FE/BE communication to use latches and implemented support for interrupt handling during both send/recv. Building on top of that work we can get rid of ImmediateInterruptOK during authentication, by immediately treating timeouts during authentication as a reason to die. As die interrupts are handled immediately during client communication that provides a sensibly quick reaction time to authentication timeout. Additionally add a few CHECK_FOR_INTERRUPTS() to some more complex authentication methods. More could be added, but this already should provides a reasonable coverage. While it this overall increases the maximum time till a timeout is reacted to, it greatly reduces complexity and increases reliability. That seems like a overall win. If the increase proves to be noticeable we can deal with those cases by moving to nonblocking network code and add interrupt checking there. Reviewed-By: Heikki Linnakangas
This commit is contained in:
@ -47,13 +47,6 @@ md5_crypt_verify(const Port *port, const char *role, char *client_pass,
|
||||
Datum datum;
|
||||
bool isnull;
|
||||
|
||||
/*
|
||||
* Disable immediate interrupts while doing database access. (Note we
|
||||
* don't bother to turn this back on if we hit one of the failure
|
||||
* conditions, since we can expect we'll just exit right away anyway.)
|
||||
*/
|
||||
ImmediateInterruptOK = false;
|
||||
|
||||
/* Get role info from pg_authid */
|
||||
roleTup = SearchSysCache1(AUTHNAME, PointerGetDatum(role));
|
||||
if (!HeapTupleIsValid(roleTup))
|
||||
@ -80,9 +73,6 @@ md5_crypt_verify(const Port *port, const char *role, char *client_pass,
|
||||
if (*shadow_pass == '\0')
|
||||
return STATUS_ERROR; /* empty password */
|
||||
|
||||
/* Re-enable immediate response to SIGTERM/SIGINT/timeout interrupts */
|
||||
ImmediateInterruptOK = true;
|
||||
/* And don't forget to detect one that already arrived */
|
||||
CHECK_FOR_INTERRUPTS();
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user