aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2018-08-15 15:01:34 +0300
committerSergey Poznyakoff <gray@gnu.org>2018-08-15 15:01:34 +0300
commit988b8e27f5df26d7e9f6fd7984677873ca1c40cb (patch)
tree15aabc0bc27950487d0377e13577d9e877eaf62c
parent082c967151db85d4ad551fa458c48fc7a783f446 (diff)
downloadpam-modules-988b8e27f5df26d7e9f6fd7984677873ca1c40cb.tar.gz
pam-modules-988b8e27f5df26d7e9f6fd7984677873ca1c40cb.tar.bz2
Bugfix
* pam_groupmember/pam_groupmember.c (split): Use standard memory allocation functions. Correctly handle empty strings (demimiter immediately followed by another delimiter.
-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
@@ -54,36 +54,51 @@ struct pam_opt pam_opt[] = {
{ NULL }
};
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;
}
static int
check_groups(char **groupnames, struct passwd *pw)
{

Return to:

Send suggestions and report system problems to the System administrator.