diff options
Diffstat (limited to 'lib/env.c')
-rw-r--r-- | lib/env.c | 66 |
1 files changed, 49 insertions, 17 deletions
@@ -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 | ||