diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/base64.c | 20 | ||||
-rw-r--r-- | lib/env.c | 66 | ||||
-rw-r--r-- | lib/graypam.h | 50 | ||||
-rw-r--r-- | lib/ldappass.c | 107 | ||||
-rw-r--r-- | lib/mem.c | 81 | ||||
-rw-r--r-- | lib/slist.c | 127 | ||||
-rw-r--r-- | lib/transform.c | 244 |
7 files changed, 456 insertions, 239 deletions
diff --git a/lib/base64.c b/lib/base64.c index 85b974a..9d0191e 100644 --- a/lib/base64.c +++ b/lib/base64.c | |||
@@ -54,15 +54,21 @@ gray_base64_decode(gray_slist_t slist, const char *iptr, size_t isize) | |||
54 | /* I have a entire block of data 32 bits get the output | 54 | /* I have a entire block of data 32 bits get the output |
55 | data. */ | 55 | data. */ |
56 | if (i == 4) { | 56 | if (i == 4) { |
57 | gray_slist_append_char(slist, | 57 | if (gray_slist_append_char(slist, |
58 | (data[0] << 2) | ((data[1] & 0x30) >> 4)); | 58 | (data[0] << 2) | ((data[1] & 0x30) >> 4)) != 1) |
59 | gray_slist_append_char(slist, | 59 | return -1; |
60 | ((data[1] & 0xf) << 4) | ((data[2] & 0x3c) >> 2)); | 60 | if (gray_slist_append_char(slist, |
61 | gray_slist_append_char(slist, | 61 | ((data[1] & 0xf) << 4) | ((data[2] & 0x3c) >> 2)) |
62 | ((data[2] & 0x3) << 6) | data[3]); | 62 | != 1) |
63 | return -1; | ||
64 | if (gray_slist_append_char(slist, | ||
65 | ((data[2] & 0x3) << 6) | data[3]) != 1) | ||
66 | return -1; | ||
63 | nbytes += 3 - pad; | 67 | nbytes += 3 - pad; |
64 | } else | 68 | } else { |
69 | errno = EILSEQ; | ||
65 | return -1; | 70 | return -1; |
71 | } | ||
66 | i = 0; | 72 | i = 0; |
67 | } | 73 | } |
68 | return nbytes; | 74 | return nbytes; |
@@ -94,7 +94,7 @@ gray_env_read_tr(const char *file_name, struct gray_env **penv, char **trmap) | |||
94 | return 1; | 94 | return 1; |
95 | } | 95 | } |
96 | 96 | ||
97 | while (p = fgets(buf, sizeof buf, fp)) { | 97 | while ((p = fgets(buf, sizeof buf, fp))) { |
98 | int len; | 98 | int len; |
99 | struct gray_env *env; | 99 | struct gray_env *env; |
100 | 100 | ||
@@ -105,17 +105,28 @@ gray_env_read_tr(const char *file_name, struct gray_env **penv, char **trmap) | |||
105 | if (len == 0) | 105 | if (len == 0) |
106 | continue; | 106 | continue; |
107 | if (p[len-1] != '\n') { | 107 | if (p[len-1] != '\n') { |
108 | if (!slist) | 108 | if (!slist) { |
109 | slist = gray_slist_create(); | 109 | slist = gray_slist_create(); |
110 | gray_slist_append(slist, p, len); | 110 | if (!slist) { |
111 | while (p = fgets(buf, sizeof buf, fp)) { | 111 | rc = errno; |
112 | break; | ||
113 | } | ||
114 | } | ||
115 | if (gray_slist_append(slist, p, len) != len) { | ||
116 | rc = errno; | ||
117 | break; | ||
118 | } | ||
119 | while ((p = fgets(buf, sizeof buf, fp))) { | ||
112 | len = strlen(p); | 120 | len = strlen(p); |
113 | gray_slist_append(slist, p, len); | 121 | gray_slist_append(slist, p, len); |
114 | if (p[len - 1] == '\n') | 122 | if (p[len - 1] == '\n') |
115 | break; | 123 | break; |
116 | } | 124 | } |
117 | gray_slist_append_char(slist, 0); | 125 | if (gray_slist_append_char(slist, 0) != 1 |
118 | p = gray_slist_finish(slist); | 126 | || (p = gray_slist_finish(slist)) == NULL) { |
127 | rc = errno; | ||
128 | break; | ||
129 | } | ||
119 | len = strlen(p); | 130 | len = strlen(p); |
120 | } | 131 | } |
121 | 132 | ||
@@ -129,10 +140,19 @@ gray_env_read_tr(const char *file_name, struct gray_env **penv, char **trmap) | |||
129 | int err = 0; | 140 | int err = 0; |
130 | 141 | ||
131 | /* Collect continuation lines */ | 142 | /* Collect continuation lines */ |
132 | if (!slist) | 143 | if (!slist) { |
133 | slist = gray_slist_create(); | 144 | slist = gray_slist_create(); |
145 | if (!slist) { | ||
146 | rc = errno; | ||
147 | break; | ||
148 | } | ||
149 | } | ||
134 | do { | 150 | do { |
135 | gray_slist_append(slist, p, len - 1); | 151 | if (gray_slist_append(slist, p, len - 1) |
152 | != len - 1) { | ||
153 | rc = errno; | ||
154 | break; | ||
155 | } | ||
136 | p = fgets (buf, sizeof buf, fp); | 156 | p = fgets (buf, sizeof buf, fp); |
137 | if (!p) | 157 | if (!p) |
138 | break; | 158 | break; |
@@ -150,26 +170,33 @@ gray_env_read_tr(const char *file_name, struct gray_env **penv, char **trmap) | |||
150 | p[len-1] = 0; | 170 | p[len-1] = 0; |
151 | len = gray_trim_ws(p); | 171 | len = gray_trim_ws(p); |
152 | } while (p[len-1] == '\\'); | 172 | } while (p[len-1] == '\\'); |
153 | if (len) | 173 | if (rc) |
154 | gray_slist_append(slist, p, len); | 174 | break; |
155 | gray_slist_append_char(slist, 0); | 175 | if (len) { |
156 | p = gray_slist_finish(slist); | 176 | if (gray_slist_append(slist, p, len) != len) { |
177 | rc = errno; | ||
178 | break; | ||
179 | } | ||
180 | } | ||
181 | if (gray_slist_append_char(slist, 0) != 1 | ||
182 | || (p = gray_slist_finish(slist)) == NULL) { | ||
183 | rc = errno; | ||
184 | break; | ||
185 | } | ||
157 | if (err) | 186 | if (err) |
158 | continue; | 187 | continue; |
159 | } | 188 | } |
160 | 189 | ||
161 | env = malloc(sizeof *env); | 190 | env = malloc(sizeof *env); |
162 | if (!env) { | 191 | if (!env) { |
163 | _pam_log(LOG_EMERG, "not enough memory"); | 192 | rc = errno; |
164 | rc = 1; | ||
165 | break; | 193 | break; |
166 | } | 194 | } |
167 | 195 | ||
168 | env->name = strdup(p); | 196 | env->name = strdup(p); |
169 | if (!env->name) { | 197 | if (!env->name) { |
170 | _pam_log(LOG_EMERG, "not enough memory"); | 198 | rc = errno; |
171 | free(env); | 199 | free(env); |
172 | rc = 1; | ||
173 | break; | 200 | break; |
174 | } | 201 | } |
175 | 202 | ||
@@ -195,7 +222,12 @@ gray_env_read_tr(const char *file_name, struct gray_env **penv, char **trmap) | |||
195 | 222 | ||
196 | gray_slist_free(&slist); | 223 | gray_slist_free(&slist); |
197 | fclose(fp); | 224 | fclose(fp); |
198 | *penv = config_env; | 225 | if (rc) { |
226 | _pam_log(LOG_EMERG, "%s", strerror(rc)); | ||
227 | gray_env_free(config_env); | ||
228 | } else { | ||
229 | *penv = config_env; | ||
230 | } | ||
199 | return rc; | 231 | return rc; |
200 | } | 232 | } |
201 | 233 | ||
diff --git a/lib/graypam.h b/lib/graypam.h index 76dcd68..69c4909 100644 --- a/lib/graypam.h +++ b/lib/graypam.h | |||
@@ -84,40 +84,30 @@ | |||
84 | 84 | ||
85 | extern jmp_buf gray_pam_jmp; | 85 | extern jmp_buf gray_pam_jmp; |
86 | 86 | ||
87 | #define gray_pam_init(retval) \ | ||
88 | if (setjmp(gray_pam_jmp)) \ | ||
89 | return retval; \ | ||
90 | |||
91 | void gray_raise(const char *fmt, ...); | ||
92 | |||
93 | void *gray_malloc(size_t size); | ||
94 | void *gray_zalloc(size_t size); | ||
95 | void *gray_calloc(size_t count, size_t size); | ||
96 | void *gray_realloc(void *ptr, size_t size); | ||
97 | void *gray_2nrealloc(void *ptr, size_t *pcount, size_t elsiz); | 87 | void *gray_2nrealloc(void *ptr, size_t *pcount, size_t elsiz); |
98 | char *gray_strdup(const char *str); | ||
99 | 88 | ||
100 | void gray_pam_delete(char *x); | 89 | void gray_pam_delete(char *x); |
101 | void gray_cleanup_string(pam_handle_t *pamh, void *x, int error_status); | 90 | void gray_cleanup_string(pam_handle_t *pamh, void *x, int error_status); |
102 | void gray_cleanup_regex(pam_handle_t *pamh, void *x, int error_status); | 91 | void gray_cleanup_regex(pam_handle_t *pamh, void *x, int error_status); |
103 | void gray_make_str(pam_handle_t *pamh, const char *str, const char *name, | 92 | void gray_make_str(pam_handle_t *pamh, const char *str, const char *name, |
104 | char **ret); | 93 | char **ret); |
105 | |||
106 | 94 | ||
107 | typedef struct gray_slist *gray_slist_t; | 95 | typedef struct gray_slist *gray_slist_t; |
108 | 96 | ||
109 | gray_slist_t gray_slist_create(); | 97 | gray_slist_t gray_slist_create(void); |
98 | int gray_slist_err(gray_slist_t slist); | ||
99 | void gray_slist_clrerr(gray_slist_t slist); | ||
110 | void gray_slist_clear(gray_slist_t slist); | 100 | void gray_slist_clear(gray_slist_t slist); |
111 | void gray_slist_free(gray_slist_t *slist); | 101 | void gray_slist_free(gray_slist_t *slist); |
112 | void gray_slist_append(gray_slist_t slist, const char *str, size_t n); | 102 | ssize_t gray_slist_append(gray_slist_t slist, const char *str, size_t n); |
113 | void gray_slist_append_char(gray_slist_t slist, char c); | 103 | ssize_t gray_slist_append_char(gray_slist_t slist, char c); |
114 | size_t gray_slist_size(gray_slist_t slist); | 104 | size_t gray_slist_size(gray_slist_t slist); |
115 | size_t gray_slist_coalesce(gray_slist_t slist); | 105 | ssize_t gray_slist_coalesce(gray_slist_t slist); |
116 | void *gray_slist_head(gray_slist_t slist, size_t *psize); | 106 | void *gray_slist_head(gray_slist_t slist, size_t *psize); |
117 | void *gray_slist_finish(gray_slist_t slist); | 107 | void *gray_slist_finish(gray_slist_t slist); |
118 | void gray_slist_grow_backslash_num(gray_slist_t slist, char *text, char **pend, | 108 | int gray_slist_grow_backslash_num(gray_slist_t slist, char *text, char **pend, |
119 |