summaryrefslogtreecommitdiffstats
path: root/lib/libpam/libpam/pam_std_option.c
diff options
context:
space:
mode:
authormarkm <markm@FreeBSD.org>2001-07-10 16:59:30 +0000
committermarkm <markm@FreeBSD.org>2001-07-10 16:59:30 +0000
commita8b501863ad5b196a10db9fa64dd61eb742bafeb (patch)
tree37fcf7797c7599ac6e9c08fd6434d9471a09459f /lib/libpam/libpam/pam_std_option.c
parentdd0572c88adf3d316465c3d0375d1209c1ef8789 (diff)
downloadFreeBSD-src-a8b501863ad5b196a10db9fa64dd61eb742bafeb.zip
FreeBSD-src-a8b501863ad5b196a10db9fa64dd61eb742bafeb.tar.gz
Fix a horrible bug introduced by myself where the options collection
keeps on growing as the module stack is parsed.
Diffstat (limited to 'lib/libpam/libpam/pam_std_option.c')
-rw-r--r--lib/libpam/libpam/pam_std_option.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/lib/libpam/libpam/pam_std_option.c b/lib/libpam/libpam/pam_std_option.c
index 4388197..026e44a 100644
--- a/lib/libpam/libpam/pam_std_option.c
+++ b/lib/libpam/libpam/pam_std_option.c
@@ -35,7 +35,7 @@
/* Everyone has to have these options. It is not an error to
* specify them and then not use them.
*/
-static struct opttab std_options[PAM_MAX_OPTIONS] = {
+struct opttab std_options[PAM_MAX_OPTIONS] = {
{ "debug", PAM_OPT_DEBUG },
{ "no_warn", PAM_OPT_NO_WARN },
{ "echo_pass", PAM_OPT_ECHO_PASS },
@@ -56,20 +56,29 @@ pam_std_option(struct options *options, struct opttab other_options[],
j = 0;
for (i = 0; i < PAM_MAX_OPTIONS; i++) {
- options->opt[i].bool = 0;
- options->opt[i].arg = NULL;
- if (j == 0 && std_options[i].name == NULL)
+ if (std_options[i].name == NULL) {
j = i;
+ break;
+ }
/* XXX Bad juju happens if loop exits with j == 0 */
}
if (other_options)
for (oo = other_options; oo->name != NULL; oo++) {
- if (oo == NULL || oo->name == NULL)
- break;
- std_options[j].name = oo->name;
- std_options[j].value = oo->value;
- j++;
+ found = 0;
+ for (i = 0; std_options[i].name; i++)
+ if (strcmp((char *)oo->name,
+ std_options[i].name) == 0)
+ found = 1;
+ if (!found) {
+ std_options[j].name = oo->name;
+ std_options[j].value = oo->value;
+ j++;
+ }
}
+ for (i = 0; i < PAM_MAX_OPTIONS; i++) {
+ options->opt[i].bool = 0;
+ options->opt[i].arg = NULL;
+ }
if (j < PAM_MAX_OPTIONS) {
std_options[j].name = NULL;
std_options[j].value = 0;
OpenPOWER on IntegriCloud