From: Michael Paquier Date: Thu, 1 Aug 2019 00:38:25 +0000 (+0900) Subject: Fix handling of previous password hooks in passwordcheck X-Git-Tag: REL9_5_19~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4536e494fdf2d6ec493751a193f8086d327848d6;p=thirdparty%2Fpostgresql.git 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 --- diff --git a/contrib/passwordcheck/passwordcheck.c b/contrib/passwordcheck/passwordcheck.c index 78c44b2d05c..8c8c3bb517d 100644 --- a/contrib/passwordcheck/passwordcheck.c +++ b/contrib/passwordcheck/passwordcheck.c @@ -26,10 +26,14 @@ 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 */ #define MIN_PWD_LENGTH 8 extern void _PG_init(void); +extern void _PG_fini(void); /* * check_password @@ -62,6 +66,11 @@ check_password(const char *username, bool pwd_has_letter, pwd_has_nonletter; + if (prev_check_password_hook) + prev_check_password_hook(username, password, + password_type, validuntil_time, + validuntil_null); + switch (password_type) { case PASSWORD_TYPE_MD5: @@ -143,5 +152,16 @@ void _PG_init(void) { /* activate password checks when the module is loaded */ + prev_check_password_hook = check_password_hook; check_password_hook = check_password; } + +/* + * Module unload function + */ +void +_PG_fini(void) +{ + /* uninstall hook */ + check_password_hook = prev_check_password_hook; +}