Skip to content

Commit bbac0ed

Browse files
geniooalders
authored andcommitted
Add a regression test to cause a stack confusion when the eof method
fails to call `SPAGAIN` after `parse`. Add a fix to the problem by calling `SPAGAIN` after `parse`. Thank you, Matthew Horsfall (@wolfsage). fix indention
1 parent 1f12f60 commit bbac0ed

4 files changed

Lines changed: 210 additions & 10 deletions

File tree

Changes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
Change history for HTML-Parser
22

33
{{$NEXT}}
4+
* Add a fix for a stack confusion error on `eof`. Thanks, Matthew Horsfall.
45

56
3.75 2020-08-30
67
* Cleanup the prereqs a bit

Parser.xs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -424,18 +424,19 @@ parse(self, chunk)
424424

425425
void
426426
eof(self)
427-
SV* self;
427+
SV* self;
428428
PREINIT:
429-
PSTATE* p_state = get_pstate_hv(aTHX_ self);
429+
PSTATE* p_state = get_pstate_hv(aTHX_ self);
430430
PPCODE:
431431
if (p_state->parsing)
432432
p_state->eof = 1;
433433
else {
434-
p_state->parsing = 1;
435-
parse(aTHX_ p_state, 0, self); /* flush */
436-
p_state->parsing = 0;
437-
}
438-
PUSHs(self);
434+
p_state->parsing = 1;
435+
parse(aTHX_ p_state, 0, self); /* flush */
436+
SPAGAIN;
437+
p_state->parsing = 0;
438+
}
439+
PUSHs(self);
439440

440441
SV*
441442
strict_comment(pstate,...)

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
[![Actions Status](https://github.com/libwww-perl/html-parser/workflows/linux/badge.svg)](https://github.com/libwww-perl/html-parser/actions)
2-
[![Actions Status](https://github.com/libwww-perl/html-parser/workflows/macos/badge.svg)](https://github.com/libwww-perl/html-parser/actions)
3-
[![Actions Status](https://github.com/libwww-perl/html-parser/workflows/windows/badge.svg)](https://github.com/libwww-perl/html-parser/actions)
1+
[![Actions Status](https://github.com/libwww-perl/HTML-Parser/workflows/linux/badge.svg)](https://github.com/libwww-perl/HTML-Parser/actions)
2+
[![Actions Status](https://github.com/libwww-perl/HTML-Parser/workflows/macos/badge.svg)](https://github.com/libwww-perl/HTML-Parser/actions)
3+
[![Actions Status](https://github.com/libwww-perl/HTML-Parser/workflows/windows/badge.svg)](https://github.com/libwww-perl/HTML-Parser/actions)
44

55
# NAME
66

t/stack-realloc-eof.t

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
use strict;
2+
use warnings;
3+
4+
use HTML::Parser ();
5+
use Test::More tests => 2;
6+
7+
# HTML-Parser core dumps on this because
8+
# of missing SPAGAIN calls in parse() XS code. It was not prepared for
9+
# the stack to get realloced.
10+
11+
my $em = <<'EOF';
12+
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body style='font-size: 10pt; font-family: Verdana,Geneva,sans-serif'>
13+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
14+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
15+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
16+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
17+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
18+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
19+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
20+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
21+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
22+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
23+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
24+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
25+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
26+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
27+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
28+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
29+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
30+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
31+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
32+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
33+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
34+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
35+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
36+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
37+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
38+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
39+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
40+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
41+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
42+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
43+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
44+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
45+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
46+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
47+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
48+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
49+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
50+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
51+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
52+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
53+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
54+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
55+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
56+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
57+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
58+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
59+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
60+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
61+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
62+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
63+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
64+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
65+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
66+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
67+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
68+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
69+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
70+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
71+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
72+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
73+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
74+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
75+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
76+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
77+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
78+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
79+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
80+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
81+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
82+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
83+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
84+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
85+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
86+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
87+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
88+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
89+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
90+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
91+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
92+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
93+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
94+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
95+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
96+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
97+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
98+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
99+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
100+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
101+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
102+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
103+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
104+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
105+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
106+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
107+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
108+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
109+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
110+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
111+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
112+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
113+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
114+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
115+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
116+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
117+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
118+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
119+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
120+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
121+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
122+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
123+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
124+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
125+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
126+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
127+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
128+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
129+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
130+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
131+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
132+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
133+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
134+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
135+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
136+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
137+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
138+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
139+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
140+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
141+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
142+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
143+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
144+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
145+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
146+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
147+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
148+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
149+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
150+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
151+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
152+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
153+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
154+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
155+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
156+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
157+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
158+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
159+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
160+
<p><span style="font-size: 10.0pt; font-family: 'Verdana','sans-serif';">cat</span></p>
161+
</body></html>
162+
EOF
163+
164+
sub handle_doc_end {
165+
my ($self) = @_;
166+
167+
# We need to construct a large list and then splice it in array context, this will
168+
# cause splice to regrow the stack and mess up the stack pointer in Parser.xs's eof
169+
my @list;
170+
171+
for (1..150) {
172+
push @list, 1; # { $_ => 1 };
173+
}
174+
175+
# ok(1, 'splicing');
176+
177+
foreach my $i (splice(@list)) { }
178+
179+
# ok(1, 'done splicing');
180+
}
181+
182+
sub extract {
183+
my $markup = shift;
184+
185+
my $parser = HTML::Parser->new(
186+
api_version => 3,
187+
handlers => {
188+
end_document => [\&handle_doc_end => 'self']
189+
},
190+
);
191+
$parser->empty_element_tags(1);
192+
$parser->parse($markup);
193+
$parser->eof();
194+
return 1;
195+
}
196+
197+
ok(extract($em), 'first call okay');
198+
ok(extract($em), 'second call okay');

0 commit comments

Comments
 (0)