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
@@ -57,30 +57,45 @@ struct pam_opt pam_opt[] = {
57static char ** 57static char **
58split(const char *str, int delim) 58split(const char *str, int delim)
59{ 59{
60 const char *p; 60 size_t i = 1;
61 size_t c = 1, i; 61 char const *p;
62 char **v; 62 char **v;
63 63
64 i = 2;
64 for (p = str; *p; p++) 65 for (p = str; *p; p++)
65 if (*p == delim) 66 if (*p == delim)
66 ++c; 67 ++i;
67
68 ++c;
69 68
70 v = gray_calloc(c, sizeof(*v)); 69 v = calloc(i, sizeof(*v));
71 70 if (v) {
72 for (p = str, i = 0; *p; p++) { 71 i = 0;
73 if (*p == delim) { 72 p = str;
74 size_t len = p - str; 73
75 char *elt = gray_malloc(len + 1); 74 while (1) {
76 memcpy(elt, str, len); 75 if (*p == delim || *p == 0) {
77 elt[len] = 0; 76 size_t len = p - str;
78 v[i++] = elt; 77 char *elt = malloc(len + 1);
79 str = ++p; 78 if (!elt) {
79 int ec = errno;
80 while (i > 0) {
81 free(v[i-1]);
82 --i;
83 }
84 free(v);
85 errno = ec;
86 return NULL;
87 }
88 memcpy(elt, str, len);
89 elt[len] = 0;
90 v[i++] = elt;
91 if (*p == 0)
92 break;
93 str = ++p;
94 } else
95 ++p;
80 } 96 }
97 v[i] = 0;
81 } 98 }
82 v[i++] = gray_strdup(str);
83 v[i] = 0;
84 return v; 99 return v;
85} 100}
86 101

Return to:

Send suggestions and report system problems to the System administrator.