aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/kconfig/confdata.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/kconfig/confdata.c')
-rw-r--r--scripts/kconfig/confdata.c61
1 files changed, 59 insertions, 2 deletions
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 52577f052bc1..13ddf1126c2a 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -182,10 +182,66 @@ static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
182 return 0; 182 return 0;
183} 183}
184 184
185#define LINE_GROWTH 16
186static int add_byte(int c, char **lineptr, size_t slen, size_t *n)
187{
188 char *nline;
189 size_t new_size = slen + 1;
190 if (new_size > *n) {
191 new_size += LINE_GROWTH - 1;
192 new_size *= 2;
193 nline = realloc(*lineptr, new_size);
194 if (!nline)
195 return -1;
196
197 *lineptr = nline;
198 *n = new_size;
199 }
200
201 (*lineptr)[slen] = c;
202
203 return 0;
204}
205
206static ssize_t compat_getline(char **lineptr, size_t *n, FILE *stream)
207{
208 char *line = *lineptr;
209 size_t slen = 0;
210
211 for (;;) {
212 int c = getc(stream);
213
214 switch (c) {
215 case '\n':
216 if (add_byte(c, &line, slen, n) < 0)
217 goto e_out;
218 slen++;
219 /* fall through */
220 case EOF:
221 if (add_byte('\0', &line, slen, n) < 0)
222 goto e_out;
223 *lineptr = line;
224 if (slen == 0)
225 return -1;
226 return slen;
227 default:
228 if (add_byte(c, &line, slen, n) < 0)
229 goto e_out;
230 slen++;
231 }
232 }
233
234e_out:
235 line[slen-1] = '\0';
236 *lineptr = line;
237 return -1;
238}
239
185int conf_read_simple(const char *name, int def) 240int conf_read_simple(const char *name, int def)
186{ 241{
187 FILE *in = NULL; 242 FILE *in = NULL;
188 char line[1024]; 243 char *line = NULL;
244 size_t line_asize = 0;
189 char *p, *p2; 245 char *p, *p2;
190 struct symbol *sym; 246 struct symbol *sym;
191 int i, def_flags; 247 int i, def_flags;
@@ -247,7 +303,7 @@ load:
247 } 303 }
248 } 304 }
249 305
250 while (fgets(line, sizeof(line), in)) { 306 while (compat_getline(&line, &line_asize, in) != -1) {
251 conf_lineno++; 307 conf_lineno++;
252 sym = NULL; 308 sym = NULL;
253 if (line[0] == '#') { 309 if (line[0] == '#') {
@@ -335,6 +391,7 @@ setsym:
335 cs->def[def].tri = EXPR_OR(cs->def[def].tri, sym->def[def].tri); 391 cs->def[def].tri = EXPR_OR(cs->def[def].tri, sym->def[def].tri);
336 } 392 }
337 } 393 }
394 free(line);
338 fclose(in); 395 fclose(in);
339 396
340 if (modules_sym) 397 if (modules_sym)