1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-05 07:21:24 +03:00

Fix handling of previous password hooks in passwordcheck

When piling up loading of modules using check_password_hook_type,
loading passwordcheck would remove any trace of a previously-loaded
hook.  Unloading the module would also cause previous hooks to be
entirely gone.

Reported-by: Rafael Castro
Author: Michael Paquier
Reviewed-by: Daniel Gustafsson
Discussion: https://postgr.es/m/15932-78f48f9ef166778c@postgresql.org
Backpatch-through: 9.4
This commit is contained in:
Michael Paquier
2019-08-01 09:38:25 +09:00
parent 9dd74ba5ae
commit 4536e494fd

View File

@ -26,10 +26,14 @@
PG_MODULE_MAGIC; PG_MODULE_MAGIC;
/* Saved hook value in case of unload */
static check_password_hook_type prev_check_password_hook = NULL;
/* passwords shorter than this will be rejected */ /* passwords shorter than this will be rejected */
#define MIN_PWD_LENGTH 8 #define MIN_PWD_LENGTH 8
extern void _PG_init(void); extern void _PG_init(void);
extern void _PG_fini(void);
/* /*
* check_password * check_password
@ -62,6 +66,11 @@ check_password(const char *username,
bool pwd_has_letter, bool pwd_has_letter,
pwd_has_nonletter; pwd_has_nonletter;
if (prev_check_password_hook)
prev_check_password_hook(username, password,
password_type, validuntil_time,
validuntil_null);
switch (password_type) switch (password_type)
{ {
case PASSWORD_TYPE_MD5: case PASSWORD_TYPE_MD5:
@ -143,5 +152,16 @@ void
_PG_init(void) _PG_init(void)
{ {
/* activate password checks when the module is loaded */ /* activate password checks when the module is loaded */
prev_check_password_hook = check_password_hook;
check_password_hook = check_password; check_password_hook = check_password;
} }
/*
* Module unload function
*/
void
_PG_fini(void)
{
/* uninstall hook */
check_password_hook = prev_check_password_hook;
}