
Commit 75d22069e tried to throw a warning for setting a custom GUC whose prefix belongs to a previously-loaded extension, if there is no such GUC defined by the extension. But that caused unstable behavior with parallel workers, because workers don't necessarily load extensions and GUCs in the same order their leader did. To make that work safely, we have to completely disallow the case. We now actually remove any such GUCs at the time of initial extension load, and then throw an error not just a warning if you try to add one later. While this might create a compatibility issue for a few people, the improvement in error-detection capability seems worth it; it's hard to believe that there's any good use-case for choosing such GUC names. This also un-reverts 5609cc01c (Rename EmitWarningsOnPlaceholders() to MarkGUCPrefixReserved()), since that function's old name is now even more of a misnomer. Florin Irion and Tom Lane Discussion: https://postgr.es/m/1902182.1640711215@sss.pgh.pa.us
77 lines
1.5 KiB
C
77 lines
1.5 KiB
C
/* -------------------------------------------------------------------------
|
|
*
|
|
* auth_delay.c
|
|
*
|
|
* Copyright (c) 2010-2022, PostgreSQL Global Development Group
|
|
*
|
|
* IDENTIFICATION
|
|
* contrib/auth_delay/auth_delay.c
|
|
*
|
|
* -------------------------------------------------------------------------
|
|
*/
|
|
#include "postgres.h"
|
|
|
|
#include <limits.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);
|
|
|
|
MarkGUCPrefixReserved("auth_delay");
|
|
|
|
/* Install Hooks */
|
|
original_client_auth_hook = ClientAuthentication_hook;
|
|
ClientAuthentication_hook = auth_delay_checks;
|
|
}
|