diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-08-15 15:01:34 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-08-15 15:01:34 +0300 |
commit | 988b8e27f5df26d7e9f6fd7984677873ca1c40cb (patch) | |
tree | 15aabc0bc27950487d0377e13577d9e877eaf62c | |
parent | 082c967151db85d4ad551fa458c48fc7a783f446 (diff) | |
download | pam-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.c | 51 |
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[] = { | |||
57 | static char ** | 57 | static char ** |
58 | split(const char *str, int delim) | 58 | split(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 | ||