* pam_groupmember/pam_groupmember.c (split): Use standard memory
allocation functions. Correctly handle empty strings (demimiter
immediately followed by another delimiter.
This commit is contained in:
Sergey Poznyakoff 2018-08-15 15:01:34 +03:00
parent 082c967151
commit 988b8e27f5

View file

@ -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 = 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;
}