aboutsummaryrefslogtreecommitdiff
path: root/lib/env.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/env.c')
-rw-r--r--lib/env.c66
1 files changed, 49 insertions, 17 deletions
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);
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

Return to:

Send suggestions and report system problems to the System administrator.