mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
b6e3798f3a
The previous definitions of these GUC variables allowed them to range up to INT_MAX, but in point of fact the underlying code would suffer overflows or other errors with large values. Reduce the maximum values to something that won't misbehave. There's no apparent value in working harder than this, since very large delays aren't sensible for any of these. (Note: the risk with archive_timeout is that if we're late checking the state, the timestamp difference it's being compared to might overflow. So we need some amount of slop; the choice of INT_MAX/2 is arbitrary.) Per followup investigation of bug #7670. Although this isn't a very significant fix, might as well back-patch.
72 lines
1.4 KiB
C
72 lines
1.4 KiB
C
/* -------------------------------------------------------------------------
|
|
*
|
|
* auth_delay.c
|
|
*
|
|
* Copyright (C) 2010-2011, PostgreSQL Global Development Group
|
|
*
|
|
* IDENTIFICATION
|
|
* contrib/auth_delay/auth_delay.c
|
|
*
|
|
* -------------------------------------------------------------------------
|
|
*/
|
|
#include "postgres.h"
|
|
|
|
#include "libpq/auth.h"
|
|
#include "port.h"
|
|
#include "utils/guc.h"
|
|
#include "utils/timestamp.h"
|
|
|
|
PG_MODULE_MAGIC;
|
|
|
|
void _PG_init(void);
|
|
|
|
/* GUC Variables */
|
|
static int auth_delay_milliseconds;
|
|
|
|
/* Original Hook */
|
|
static ClientAuthentication_hook_type original_client_auth_hook = NULL;
|
|
|
|
/*
|
|
* Check authentication
|
|
*/
|
|
static void
|
|
auth_delay_checks(Port *port, int status)
|
|
{
|
|
/*
|
|
* Any other plugins which use ClientAuthentication_hook.
|
|
*/
|
|
if (original_client_auth_hook)
|
|
original_client_auth_hook(port, status);
|
|
|
|
/*
|
|
* Inject a short delay if authentication failed.
|
|
*/
|
|
if (status != STATUS_OK)
|
|
{
|
|
pg_usleep(1000L * auth_delay_milliseconds);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Module Load Callback
|
|
*/
|
|
void
|
|
_PG_init(void)
|
|
{
|
|
/* Define custom GUC variables */
|
|
DefineCustomIntVariable("auth_delay.milliseconds",
|
|
"Milliseconds to delay before reporting authentication failure",
|
|
NULL,
|
|
&auth_delay_milliseconds,
|
|
0,
|
|
0, INT_MAX / 1000,
|
|
PGC_SIGHUP,
|
|
GUC_UNIT_MS,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
/* Install Hooks */
|
|
original_client_auth_hook = ClientAuthentication_hook;
|
|
ClientAuthentication_hook = auth_delay_checks;
|
|
}
|