aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pam_groupmember/pam_groupmember.c51
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;
}

Return to:

Send suggestions and report system problems to the System administrator.