aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorCody Schafer <cody@linux.vnet.ibm.com>2012-07-13 14:27:12 -0400
committerMichal Marek <mmarek@suse.cz>2012-07-13 16:51:30 -0400
commit1a7a8c6fd8ca24d3692dacddf8d658c9bb9c14ad (patch)
tree4be8c71a267130b2df0309f46a4e7b99395f2ab7 /scripts
parent92b72e8bcbb0d21457b53887bf41db3527258253 (diff)
kconfig: allow long lines in config file
For some config options (CONFIG_EXTRA_FIRMWARE, for example), the length of a config file line can exceed the 1024 byte buffer. Switch from fgets to compat_getline to fix. compat_getline is an internally implimented getline work-alike for portability purposes. Signed-off-by: Cody Schafer <cody@linux.vnet.ibm.com> Signed-off-by: Michal Marek <mmarek@suse.cz>
Diffstat (limited to 'scripts')
-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)