aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/base64.c20
-rw-r--r--lib/env.c64
-rw-r--r--lib/graypam.h46
-rw-r--r--lib/ldappass.c89
-rw-r--r--lib/mem.c79
-rw-r--r--lib/slist.c115
-rw-r--r--lib/transform.c190
-rw-r--r--pam_groupmember/pam_groupmember.c1
-rw-r--r--pam_innetgr/pam_innetgr.c1
-rw-r--r--pam_ldaphome/pam_ldaphome.c262
-rw-r--r--pam_log/pam_log.c28
-rw-r--r--pam_regex/pam_regex.c16
-rw-r--r--pam_sql/pam_mysql.c10
-rw-r--r--pam_sql/pam_pgsql.c12
-rw-r--r--pam_sql/pam_sql.c73
-rw-r--r--pam_sql/pam_sql.h5
-rw-r--r--pam_umotd/pam_umotd.c23
17 files changed, 683 insertions, 351 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;
diff --git a/lib/env.c b/lib/env.c
index 83152e4..b1da177 100644
--- a/lib/env.c
+++ b/lib/env.c
@@ -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);
225 if (rc) {
226 _pam_log(LOG_EMERG, "%s", strerror(rc));
227 gray_env_free(config_env);
228 } else {
198 *penv = config_env; 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,18 +84,7 @@
84 84
85extern jmp_buf gray_pam_jmp; 85extern jmp_buf gray_pam_jmp;
86 86
87#define gray_pam_init(retval) \
88 if (setjmp(gray_pam_jmp)) \
89 return retval; \
90
91void gray_raise(const char *fmt, ...);
92
93void *gray_malloc(size_t size);
94void *gray_zalloc(size_t size);
95void *gray_calloc(size_t count, size_t size);
96void *gray_realloc(void *ptr, size_t size);
97void *gray_2nrealloc(void *ptr, size_t *pcount, size_t elsiz); 87void *gray_2nrealloc(void *ptr, size_t *pcount, size_t elsiz);
98char *gray_strdup(const char *str);
99 88
100void gray_pam_delete(char *x); 89void gray_pam_delete(char *x);
101void gray_cleanup_string(pam_handle_t *pamh, void *x, int error_status); 90void gray_cleanup_string(pam_handle_t *pamh, void *x, int error_status);
@@ -103,21 +92,22 @@ void gray_cleanup_regex(pam_handle_t *pamh, void *x, int error_status);
103void gray_make_str(pam_handle_t *pamh, const char *str, const char *name, 92void gray_make_str(pam_handle_t *pamh, const char *str, const char *name,
104 char **ret); 93 char **ret);
105 94
106
107typedef struct gray_slist *gray_slist_t; 95typedef struct gray_slist *gray_slist_t;
108 96
109gray_slist_t gray_slist_create(); 97gray_slist_t gray_slist_create(void);
98int gray_slist_err(gray_slist_t slist);
99void gray_slist_clrerr(gray_slist_t slist);
110void gray_slist_clear(gray_slist_t slist); 100void gray_slist_clear(gray_slist_t slist);