mirror of
git://git.gnu.org.ua/pam-modules.git
synced 2025-04-26 00:19:52 +03:00
Bugfix
* 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:
parent
082c967151
commit
988b8e27f5
1 changed files with 33 additions and 18 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue