Skip to content

Commit 23acf2d

Browse files
benhoytmsquire
andauthored
If a line is longer than INI_MAX_LINE, consume input up to next newline (#188)
Thanks @msquire! Co-authored-by: Mike Squire <[email protected]> Co-authored-by: Ben Hoyt <[email protected]>
1 parent 7914ad7 commit 23acf2d

File tree

6 files changed

+28
-30
lines changed

6 files changed

+28
-30
lines changed

ini.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,19 +107,20 @@ int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
107107
#endif
108108
#if INI_ALLOW_REALLOC && !INI_USE_STACK
109109
char* new_line;
110-
size_t offset;
111110
#endif
112111
char section[MAX_SECTION] = "";
113112
#if INI_ALLOW_MULTILINE
114113
char prev_name[MAX_NAME] = "";
115114
#endif
116115

116+
size_t offset;
117117
char* start;
118118
char* end;
119119
char* name;
120120
char* value;
121121
int lineno = 0;
122122
int error = 0;
123+
char abyss[16]; /* Used to consume input when a line is too long. */
123124

124125
#if !INI_USE_STACK
125126
line = (char*)ini_malloc(INI_INITIAL_ALLOC);
@@ -136,8 +137,9 @@ int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
136137

137138
/* Scan through stream line by line */
138139
while (reader(line, (int)max_line, stream) != NULL) {
139-
#if INI_ALLOW_REALLOC && !INI_USE_STACK
140140
offset = strlen(line);
141+
142+
#if INI_ALLOW_REALLOC && !INI_USE_STACK
141143
while (offset == max_line - 1 && line[offset - 1] != '\n') {
142144
max_line *= 2;
143145
if (max_line > INI_MAX_LINE)
@@ -150,14 +152,24 @@ int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
150152
line = new_line;
151153
if (reader(line + offset, (int)(max_line - offset), stream) == NULL)
152154
break;
155+
offset += strlen(line + offset);
153156
if (max_line >= INI_MAX_LINE)
154157
break;
155-
offset += strlen(line + offset);
156158
}
157159
#endif
158160

159161
lineno++;
160162

163+
/* If line exceeded INI_MAX_LINE bytes, discard till end of line. */
164+
if (offset == max_line - 1 && line[offset - 1] != '\n') {
165+
while (reader(abyss, sizeof(abyss), stream) != NULL) {
166+
if (!error)
167+
error = lineno;
168+
if (abyss[strlen(abyss) - 1] == '\n')
169+
break;
170+
}
171+
}
172+
161173
start = line;
162174
#if INI_ALLOW_BOM
163175
if (lineno == 1 && (unsigned char)start[0] == 0xEF &&

tests/baseline_heap_max_line.txt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ no_file.ini: e=-1 user=0
88
... [comment_test]
99
... test1=1;2;3;
1010
... test2=2;3;4;this;
11-
... test2=needs whitespace b;
1211
... test;3=345;
1312
... test4=4#5#6;
14-
... test4=only starts a comm;
1513
... test7=;
1614
... test8=; not a comm;
1715
... [colon_tests]
@@ -22,7 +20,7 @@ no_file.ini: e=-1 user=0
2220
... funny2=with : col;
2321
... funny3=two = equa;
2422
... funny4=two : colo;
25-
normal.ini: e=2 user=101
23+
normal.ini: e=1 user=101
2624
... [section1]
2725
... name1=value1;
2826
... name2=value2;
@@ -47,11 +45,9 @@ user_error.ini: e=3 user=104
4745
... multi=the quick;
4846
... multi=brown fox;
4947
... name=bob smith;
50-
... name=comment line 1;
51-
... name=comment line 2;
5248
... foo=bar;
5349
... foo=Hi World;
54-
multi_line.ini: e=5 user=105
50+
multi_line.ini: e=4 user=105
5551
bad_multi.ini: e=1 user=105
5652
... [bom_section]
5753
... bom_name=bom_value;
@@ -69,4 +65,4 @@ duplicate_sections.ini: e=0 user=108
6965
... key1=val1;
7066
no_value.ini: e=2 user=109
7167
... name=value;
72-
long_section.ini: e=2 user=110
68+
long_section.ini: e=1 user=110

tests/baseline_heap_realloc_max_line.txt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ no_file.ini: e=-1 user=0
88
... [comment_test]
99
... test1=1;2;3;
1010
... test2=2;3;4;this;
11-
... test2=needs whitespace b;
1211
... test;3=345;
1312
... test4=4#5#6;
14-
... test4=only starts a comm;
1513
... test7=;
1614
... test8=; not a comm;
1715
... [colon_tests]
@@ -22,7 +20,7 @@ no_file.ini: e=-1 user=0
2220
... funny2=with : col;
2321
... funny3=two = equa;
2422
... funny4=two : colo;
25-
normal.ini: e=2 user=101
23+
normal.ini: e=1 user=101
2624
... [section1]
2725
... name1=value1;
2826
... name2=value2;
@@ -47,11 +45,9 @@ user_error.ini: e=3 user=104
4745
... multi=the quick;
4846
... multi=brown fox;
4947
... name=bob smith;
50-
... name=comment line 1;
51-
... name=comment line 2;
5248
... foo=bar;
5349
... foo=Hi World;
54-
multi_line.ini: e=5 user=105
50+
multi_line.ini: e=4 user=105
5551
bad_multi.ini: e=1 user=105
5652
... [bom_section]
5753
... bom_name=bom_value;
@@ -69,4 +65,4 @@ duplicate_sections.ini: e=0 user=108
6965
... key1=val1;
7066
no_value.ini: e=2 user=109
7167
... name=value;
72-
long_section.ini: e=2 user=110
68+
long_section.ini: e=1 user=110

tests/baseline_heap_string.txt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@ crlf: e=0 user=102
1010
... [sec]
1111
... foo=0123456789012;
1212
... bar=4321;
13-
long line: e=3 user=103
13+
long line: e=2 user=103
1414
... [sec]
1515
... foo=0123456789012;
16-
... bix=1234;
17-
long continued: e=0 user=104
16+
long continued: e=2 user=104
1817
... [s]
1918
... a=1;
2019
... c=3;

tests/baseline_multi_max_line.txt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ no_file.ini: e=-1 user=0
88
... [comment_test]
99
... test1=1;2;3;
1010
... test2=2;3;4;this;
11-
... test2=needs whitespace b;
1211
... test;3=345;
1312
... test4=4#5#6;
14-
... test4=only starts a comm;
1513
... test7=;
1614
... test8=; not a comm;
1715
... [colon_tests]
@@ -22,7 +20,7 @@ no_file.ini: e=-1 user=0
2220
... funny2=with : col;
2321
... funny3=two = equa;
2422
... funny4=two : colo;
25-
normal.ini: e=2 user=101
23+
normal.ini: e=1 user=101
2624
... [section1]
2725
... name1=value1;
2826
... name2=value2;
@@ -47,11 +45,9 @@ user_error.ini: e=3 user=104
4745
... multi=the quick;
4846
... multi=brown fox;
4947
... name=bob smith;
50-
... name=comment line 1;
51-
... name=comment line 2;
5248
... foo=bar;
5349
... foo=Hi World;
54-
multi_line.ini: e=5 user=105
50+
multi_line.ini: e=4 user=105
5551
bad_multi.ini: e=1 user=105
5652
... [bom_section]
5753
... bom_name=bom_value;
@@ -69,4 +65,4 @@ duplicate_sections.ini: e=0 user=108
6965
... key1=val1;
7066
no_value.ini: e=2 user=109
7167
... name=value;
72-
long_section.ini: e=2 user=110
68+
long_section.ini: e=1 user=110

tests/baseline_string.txt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@ crlf: e=0 user=102
1010
... [sec]
1111
... foo=0123456789012;
1212
... bar=4321;
13-
long line: e=3 user=103
13+
long line: e=2 user=103
1414
... [sec]
1515
... foo=0123456789012;
16-
... bix=1234;
17-
long continued: e=0 user=104
16+
long continued: e=2 user=104
1817
... [s]
1918
... a=1;
2019
... c=3;

0 commit comments

Comments
 (0)