diff options
-rw-r--r-- | pam_groupmember/pam_groupmember.c | 51 |
1 files changed, 33 insertions, 18 deletions
diff --git a/pam_groupmember/pam_groupmember.c b/pam_groupmember/pam_groupmember.c index ba418d0..7045d13 100644 --- a/pam_groupmember/pam_groupmember.c +++ b/pam_groupmember/pam_groupmember.c @@ -57,30 +57,45 @@ struct pam_opt pam_opt[] = { static char ** split(const char *str, int delim) { - const char *p; - size_t c = 1, i; + size_t i = 1; + char const *p; char **v; - + + i = 2; for (p = str; *p; p++) if (*p == delim) - ++c; - - ++c; + ++i; - v = gray_calloc(c, sizeof(*v)); - - for (p = str, i = 0; *p; p++) { - if (*p == delim) { - size_t len = p - str; - char *elt = gray_malloc(len + 1); - memcpy(elt, str, len); - elt[len] = 0; - v[i++] = elt; - str = ++p; + v = calloc(i, sizeof(*v)); + if (v) { + i = 0; + p = str; + + while (1) { + if (*p == delim || *p == 0) { + size_t len = p - str; + char *elt = malloc(len + 1); + if (!elt) { + int ec = errno; + while (i > 0) { + free(v[i-1]); + --i; + } + free(v); + errno = ec; + return NULL; + } + memcpy(elt, str, len); + elt[len] = 0; + v[i++] = elt; + if (*p == 0) + break; + str = ++p; + } else + ++p; } + v[i] = 0; } - v[i++] = gray_strdup(str); - v[i] = 0; return v; } |