diff options
author | Alexandra Ellwood <lxs@mit.edu> | 2008-04-25 17:16:21 +0000 |
---|---|---|
committer | Alexandra Ellwood <lxs@mit.edu> | 2008-04-25 17:16:21 +0000 |
commit | 0e4f04e2152d42ded83041487d9557fa752ef1ea (patch) | |
tree | 2ceb6ac62dc0c59aaeec443628e750e7a3c1aa13 | |
parent | e92873ac2e95d345ef1b78da73fb6083f1f94cce (diff) | |
download | krb5-0e4f04e2152d42ded83041487d9557fa752ef1ea.zip krb5-0e4f04e2152d42ded83041487d9557fa752ef1ea.tar.gz krb5-0e4f04e2152d42ded83041487d9557fa752ef1ea.tar.bz2 |
Generate a large enough array to hold all the base/extension pairs.
Store pairs without overlapping.
ticket: 5948
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@20308 dc483132-0cff-0310-8789-dd5450dbe970
-rw-r--r-- | src/util/support/plugins.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/util/support/plugins.c b/src/util/support/plugins.c index 77b3745..90e16f3 100644 --- a/src/util/support/plugins.c +++ b/src/util/support/plugins.c @@ -369,26 +369,32 @@ krb5int_get_plugin_filenames (const char * const *filebases, char ***filenames) long err = 0; static const char *const fileexts[] = FILEEXTS; char **tempnames = NULL; - int i; + size_t bases_count = 0; + size_t exts_count = 0; + size_t i; + if (!filebases) { err = EINVAL; } + if (!filenames) { err = EINVAL; } + if (!err) { - size_t count = 0; - for (i = 0; filebases[i] != NULL; i++, count++); - for (i = 0; fileexts[i] != NULL; i++, count++); - tempnames = calloc (count, sizeof (char *)); - if (tempnames == NULL) { err = errno; } + for (i = 0; filebases[i]; i++) { bases_count++; } + for (i = 0; fileexts[i]; i++) { exts_count++; } + tempnames = calloc ((bases_count * exts_count)+1, sizeof (char *)); + if (!tempnames) { err = errno; } } if (!err) { int j; - for (i = 0; !err && (filebases[i] != NULL); i++) { - for (j = 0; !err && (fileexts[j] != NULL); j++) { - if (asprintf(&tempnames[i+j], "%s%s", filebases[i], fileexts[j]) < 0) { - tempnames[i+j] = NULL; + for (i = 0; !err && filebases[i]; i++) { + for (j = 0; !err && fileexts[j]; j++) { + if (asprintf(&tempnames[(i*exts_count)+j], "%s%s", + filebases[i], fileexts[j]) < 0) { + tempnames[(i*exts_count)+j] = NULL; err = errno; } } } + tempnames[bases_count * exts_count] = NULL; /* NUL-terminate */ } if (!err) { @@ -396,7 +402,7 @@ krb5int_get_plugin_filenames (const char * const *filebases, char ***filenames) tempnames = NULL; } - if (tempnames != NULL) { krb5int_free_plugin_filenames (tempnames); } + if (tempnames) { krb5int_free_plugin_filenames (tempnames); } return err; } |