MINOR: cfgparse: remove line size limitation

Remove the line size limitation of the configuration parser.  The buffer
is now allocated dynamically and grows when the line is too long.
This commit is contained in:
William Lallemand 2015-05-12 14:25:37 +02:00 committed by Willy Tarreau
parent 3f41560f61
commit 64e84516c4

View File

@ -6274,12 +6274,19 @@ out:
*/
int readcfgfile(const char *file)
{
char thisline[LINESIZE];
char *thisline;
int linesize = LINESIZE;
FILE *f;
int linenum = 0;
int err_code = 0;
struct cfg_section *cs = NULL;
struct cfg_section *ics;
int readbytes = 0;
if ((thisline = malloc(sizeof(*thisline) * linesize)) == NULL) {
Alert("parsing [%s:%d] : out of memory.\n", file, linenum);
return -1;
}
/* Register internal sections */
if (!cfg_register_section("listen", cfg_parse_listen) ||
@ -6297,7 +6304,7 @@ int readcfgfile(const char *file)
if ((f=fopen(file,"r")) == NULL)
return -1;
while (fgets(thisline, sizeof(thisline), f) != NULL) {
while (fgets(thisline + readbytes, linesize - readbytes, f) != NULL) {
int arg, kwm = KWM_STD;
char *end;
char *args[MAX_LINE_ARGS + 1];
@ -6309,15 +6316,29 @@ int readcfgfile(const char *file)
end = line + strlen(line);
if (end-line == sizeof(thisline)-1 && *(end-1) != '\n') {
if (end-line == linesize-1 && *(end-1) != '\n') {
/* Check if we reached the limit and the last char is not \n.
* Watch out for the last line without the terminating '\n'!
*/
Alert("parsing [%s:%d]: line too long, limit: %d.\n",
file, linenum, (int)sizeof(thisline)-1);
char *newline;
int newlinesize = linesize * 2;
newline = realloc(thisline, sizeof(*thisline) * newlinesize);
if (newline == NULL) {
Alert("parsing [%s:%d]: line too long, cannot allocate memory.\n",
file, linenum);
err_code |= ERR_ALERT | ERR_FATAL;
continue;
}
readbytes = linesize - 1;
linesize = newlinesize;
thisline = newline;
continue;
}
readbytes = 0;
/* skip leading spaces */
while (isspace((unsigned char)*line))
line++;
@ -6486,6 +6507,7 @@ int readcfgfile(const char *file)
break;
}
cursection = NULL;
free(thisline);
fclose(f);
return err_code;
}