diff options
-rw-r--r-- | pam_groupmember/pam_groupmember.c | 37 |
1 files changed, 26 insertions, 11 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; + ++i; - ++c; + v = calloc(i, sizeof(*v)); + if (v) { + i = 0; + p = str; - v = gray_calloc(c, sizeof(*v)); - - for (p = str, i = 0; *p; p++) { - if (*p == delim) { + while (1) { + if (*p == delim || *p == 0) { size_t len = p - str; - char *elt = gray_malloc(len + 1); + 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++] = gray_strdup(str); v[i] = 0; + } return v; } |