|
Neohapsis is currently accepting applications for employment. For more information, please visit our website www.neohapsis.com or email hr@neohapsis.com |
From: Steve Langasek (vorlon
netexpress.net)Date: Sat Mar 03 2001 - 17:12:19 CST
Hello all,
I've found evidence that suggests there's a subtle but serious incompatibility
between Linux-PAM's conversation function handling and that of other PAM
implementations (apparently FreeBSD and Solaris). I'd appreciate it if anyone
can confirm or deny this particular problem, and if it is a real problem I'd
be interested to know what people think should be done about it.
Background
The type of the conversation function is defined in the PAM header files as
follows:
struct pam_conv {
int (*conv)(int num_msg, const struct pam_message **msg,
struct pam_response **resp, void *appdata_ptr);
void *appdata_ptr;
};
The second argument to the conversation function, 'const struct pam_message
**msg', is unavoidably ambiguous; msg could be a pointer to (the address of
the first element of) an array, or it could be (the address of the first
element of) an array of pointers. It's clearly important to know which
meaning is in use here, because incrementing the wrong pointer is a sure way
to get a segfault. In Linux-PAM, the meaning is taken to be the second, 'an
array of pointers', and this is how it's used by both the modules and the
sample conversation function included in libpam_misc. And as long as everyone
agrees on this usage, there's no problem.
Problem
I recently downloaded and compiled Frank Cusack's pam_krb5 module. You can
imagine my dismay when I found that my application was segfaulting for
precisely the reason mentioned above: instead of passing an array of pointers
to my conversation function, pam_krb5 was passing a pointer to an array. This
is clearly not just a bug in pam_krb5, because it leaves the password-changing
functionality entirely broken under Linux-PAM and my entire motive for
downloading the module was that Nicolas Williams asserted that it handled
password expiry correctly. Checking with him, I've confirmed that none of the
patches he's applied to the source change the usage of the conversation
function. So the only explanation I have is that this module works... just
not with Linux-PAM.
Solution?
If it's true that we have an API incompatibility here, the question then
becomes, what do we do about it? That the problem should escape notice for so
long is a sure indication that few people are affected by it, probably because
few PAM modules ever call the conversation function with more than one message
at a time. As developers' use of PAM becomes more complex, however, and as we
move towards the goal of 'OpenPAM', this incompatibility will become more of a
problem for those trying to write cross-platform PAM modules and conversation
functions.
The good news is that the problem affects only the conversation functions and
the modules; a change in behavior won't require a recompile of many
applications (none of those that use libpam_misc's misc_conv). The bad news
is, changing Linux-PAM will make it incompatible with existing third-party
modules and with applications that provide their own conversation functions.
This would make the switch painful in the short term, but IMHO the long-term
benefits make this the right decision... the longer the situation is allowed
to persist, the more painful it would be to correct the problem in the future.
Steve Langasek
postmodern programmer
_______________________________________________
Pam-list mailing list
Pam-list
redhat.com
https://listman.redhat.com/mailman/listinfo/pam-list
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]