Record which primitive is currently executing before calling the

service module.  Use that information to generate a much better
error message when indirect recursion is detected.

Instrument openpam_dispatch()'s entry and exit points.


git-svn-id: svn+ssh://svn.openpam.org/svn/openpam/trunk@186 185d5e19-27fe-0310-9dcf-9bff6b9f3609
This commit is contained in:
Dag-Erling Smørgrav 2002-12-12 17:04:04 +00:00
parent b0ba976453
commit bf8598063a
1 changed files with 12 additions and 7 deletions

View File

@ -31,7 +31,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $P4: //depot/projects/openpam/lib/openpam_dispatch.c#17 $ * $P4: //depot/projects/openpam/lib/openpam_dispatch.c#18 $
*/ */
#include <sys/param.h> #include <sys/param.h>
@ -60,13 +60,18 @@ openpam_dispatch(pam_handle_t *pamh,
pam_chain_t *chain; pam_chain_t *chain;
int err, fail, r; int err, fail, r;
ENTER();
if (pamh == NULL) if (pamh == NULL)
return (PAM_SYSTEM_ERR); RETURNC(PAM_SYSTEM_ERR);
/* prevent recursion */ /* prevent recursion */
if (pamh->current != NULL) { if (pamh->current != NULL) {
openpam_log(PAM_LOG_ERROR, "indirect recursion"); openpam_log(PAM_LOG_ERROR,
return (PAM_ABORT); "%s() called while %s::%s() is in progress",
_pam_func_name[primitive],
pamh->current->module->path,
_pam_sm_func_name[pamh->primitive]);
RETURNC(PAM_ABORT);
} }
/* pick a chain */ /* pick a chain */
@ -86,7 +91,7 @@ openpam_dispatch(pam_handle_t *pamh,
chain = pamh->chains[PAM_PASSWORD]; chain = pamh->chains[PAM_PASSWORD];
break; break;
default: default:
return (PAM_SYSTEM_ERR); RETURNC(PAM_SYSTEM_ERR);
} }
/* execute */ /* execute */
@ -98,6 +103,7 @@ openpam_dispatch(pam_handle_t *pamh,
chain->module->path, _pam_sm_func_name[primitive]); chain->module->path, _pam_sm_func_name[primitive]);
continue; continue;
} else { } else {
pamh->primitive = primitive;
pamh->current = chain; pamh->current = chain;
r = (chain->module->func[primitive])(pamh, flags, r = (chain->module->func[primitive])(pamh, flags,
chain->optc, (const char **)chain->optv); chain->optc, (const char **)chain->optv);
@ -153,8 +159,7 @@ openpam_dispatch(pam_handle_t *pamh,
if (!fail && err != PAM_NEW_AUTHTOK_REQD) if (!fail && err != PAM_NEW_AUTHTOK_REQD)
err = PAM_SUCCESS; err = PAM_SUCCESS;
openpam_log(PAM_LOG_DEBUG, "returning: %s", pam_strerror(pamh, err)); RETURNC(err);
return (err);
} }
#if !defined(OPENPAM_RELAX_CHECKS) #if !defined(OPENPAM_RELAX_CHECKS)