postgres.git / summary / log / commit / refs

commit    a7eb28d0caa8db3e81e46921afc6cca5e4cf388a
Author:   Michael Paquier <michael@paquier.xyz>
Date:     Thu Aug 01 00:38:02 2019 +0000
First released in: 13.0, 9.4.24, 9.5.19, 9.6.15, 10.10, 11.5, 12.0

    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


contrib/passwordcheck/passwordcheck.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/contrib/passwordcheck/passwordcheck.c b/contrib/passwordcheck/passwordcheck.c index d3d9ff36761..9f5e15070c8 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 @@ -55,6 +59,11 @@ check_password(const char *username, Datum validuntil_time, bool validuntil_null) { + if (prev_check_password_hook) + prev_check_password_hook(username, shadow_pass, + password_type, validuntil_time, + validuntil_null); + if (password_type != PASSWORD_TYPE_PLAINTEXT) { /* @@ -133,5 +142,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; +} [parent: c64e2970592c]