From f9147c4e408d316d194c4e367dfccbf433cb8ec9 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 15 Jun 2006 01:54:09 +0000 Subject: r16241: Fix Klocwork #106 and others like it. Make 2 important changes. pdb_get_methods() returning NULL is a *fatal* error. Don't try and cope with it just call smb_panic. This removes a *lot* of pointless "if (!pdb)" handling code. Secondly, ensure that if samu_init() fails we *always* back out of a function. That way we are never in a situation where the pdb_XXX() functions need to start with a "if (sampass)" test - this was just bad design, not defensive programming. Jeremy. (This used to be commit a0d368197d6ae6777b7c2c3c6e970ab8ae7ca2ae) --- source3/pam_smbpass/pam_smb_acct.c | 140 ++++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 66 deletions(-) (limited to 'source3/pam_smbpass/pam_smb_acct.c') diff --git a/source3/pam_smbpass/pam_smb_acct.c b/source3/pam_smbpass/pam_smb_acct.c index 8970ffa8edf..47bf0594798 100644 --- a/source3/pam_smbpass/pam_smb_acct.c +++ b/source3/pam_smbpass/pam_smb_acct.c @@ -42,72 +42,80 @@ int pam_sm_acct_mgmt( pam_handle_t *pamh, int flags, int argc, const char **argv ) { - unsigned int ctrl; - int retval; - - const char *name; - struct samu *sampass = NULL; - void (*oldsig_handler)(int); - extern BOOL in_client; - - /* Samba initialization. */ - load_case_tables(); - setup_logging( "pam_smbpass", False ); - in_client = True; - - ctrl = set_ctrl( flags, argc, argv ); - - /* get the username */ - - retval = pam_get_user( pamh, &name, "Username: " ); - if (retval != PAM_SUCCESS) { - if (on( SMB_DEBUG, ctrl )) { - _log_err( LOG_DEBUG, "acct: could not identify user" ); - } - return retval; - } - if (on( SMB_DEBUG, ctrl )) { - _log_err( LOG_DEBUG, "acct: username [%s] obtained", name ); - } - - /* Getting into places that might use LDAP -- protect the app - from a SIGPIPE it's not expecting */ - oldsig_handler = CatchSignal(SIGPIPE, SIGNAL_CAST SIG_IGN); - if (!initialize_password_db(True)) { - _log_err( LOG_ALERT, "Cannot access samba password database" ); - CatchSignal(SIGPIPE, SIGNAL_CAST oldsig_handler); - return PAM_AUTHINFO_UNAVAIL; - } - - /* Get the user's record. */ - - if ( (sampass = samu_new( NULL )) != NULL ) { - pdb_getsampwnam(sampass, name ); - } - - /* check for lookup failure */ - if ( !sampass || !strlen(pdb_get_username(sampass)) ) { - CatchSignal(SIGPIPE, SIGNAL_CAST oldsig_handler); - return PAM_USER_UNKNOWN; - } - - if (pdb_get_acct_ctrl(sampass) & ACB_DISABLED) { - if (on( SMB_DEBUG, ctrl )) { - _log_err( LOG_DEBUG - , "acct: account %s is administratively disabled", name ); - } - make_remark( pamh, ctrl, PAM_ERROR_MSG - , "Your account has been disabled; " - "please see your system administrator." ); - - CatchSignal(SIGPIPE, SIGNAL_CAST oldsig_handler); - return PAM_ACCT_EXPIRED; - } - - /* TODO: support for expired passwords. */ - - CatchSignal(SIGPIPE, SIGNAL_CAST oldsig_handler); - return PAM_SUCCESS; + unsigned int ctrl; + int retval; + + const char *name; + struct samu *sampass = NULL; + void (*oldsig_handler)(int); + extern BOOL in_client; + + /* Samba initialization. */ + load_case_tables(); + setup_logging( "pam_smbpass", False ); + in_client = True; + + ctrl = set_ctrl( flags, argc, argv ); + + /* get the username */ + + retval = pam_get_user( pamh, &name, "Username: " ); + if (retval != PAM_SUCCESS) { + if (on( SMB_DEBUG, ctrl )) { + _log_err( LOG_DEBUG, "acct: could not identify user" ); + } + return retval; + } + if (on( SMB_DEBUG, ctrl )) { + _log_err( LOG_DEBUG, "acct: username [%s] obtained", name ); + } + + /* Getting into places that might use LDAP -- protect the app + from a SIGPIPE it's not expecting */ + oldsig_handler = CatchSignal(SIGPIPE, SIGNAL_CAST SIG_IGN); + if (!initialize_password_db(True)) { + _log_err( LOG_ALERT, "Cannot access samba password database" ); + CatchSignal(SIGPIPE, SIGNAL_CAST oldsig_handler); + return PAM_AUTHINFO_UNAVAIL; + } + + /* Get the user's record. */ + + if (!(sampass = samu_new( NULL ))) { + CatchSignal(SIGPIPE, SIGNAL_CAST oldsig_handler); + /* malloc fail. */ + return nt_status_to_pam(NT_STATUS_NO_MEMORY); + } + + if (!pdb_getsampwnam(sampass, name )) { + _log_err( LOG_DEBUG, "acct: could not identify user" ); + CatchSignal(SIGPIPE, SIGNAL_CAST oldsig_handler); + return PAM_USER_UNKNOWN; + } + + /* check for lookup failure */ + if (!strlen(pdb_get_username(sampass)) ) { + CatchSignal(SIGPIPE, SIGNAL_CAST oldsig_handler); + return PAM_USER_UNKNOWN; + } + + if (pdb_get_acct_ctrl(sampass) & ACB_DISABLED) { + if (on( SMB_DEBUG, ctrl )) { + _log_err( LOG_DEBUG + , "acct: account %s is administratively disabled", name ); + } + make_remark( pamh, ctrl, PAM_ERROR_MSG + , "Your account has been disabled; " + "please see your system administrator." ); + + CatchSignal(SIGPIPE, SIGNAL_CAST oldsig_handler); + return PAM_ACCT_EXPIRED; + } + + /* TODO: support for expired passwords. */ + + CatchSignal(SIGPIPE, SIGNAL_CAST oldsig_handler); + return PAM_SUCCESS; } /* static module data */ -- cgit