diff --git a/src/mochiweb_html.erl b/src/mochiweb_html.erl
index b10bbe39..0f281db9 100644
--- a/src/mochiweb_html.erl
+++ b/src/mochiweb_html.erl
@@ -404,8 +404,8 @@ destack(TagName, Stack) when is_list(Stack) ->
{_, []} ->
%% Actually was a singleton
Stack;
- {Pre, [{T1, A1, []} | Post1]} ->
- [{T0, A0, [{T1, A1, lists:reverse(Pre)} | Post1]}
+ {Pre, [{T1, A1, Acc1} | Post1]} ->
+ [{T0, A0, [{T1, A1, Acc1 ++ lists:reverse(Pre)} | Post1]}
| Post0]
end;
_ ->
@@ -576,6 +576,10 @@ find_qgt(Bin, S=#decoder{offset=O}) ->
case Bin of
<<_:O/binary, "?>", _/binary>> ->
?ADV_COL(S, 2);
+ <<_:O/binary, ">", _/binary>> ->
+ ?ADV_COL(S, 1);
+ <<_:O/binary, "/>", _/binary>> ->
+ ?ADV_COL(S, 2);
%% tokenize_attributes takes care of this state:
%% <<_:O/binary, C, _/binary>> ->
%% find_qgt(Bin, ?INC_CHAR(S, C));
@@ -1236,5 +1240,25 @@ parse_missing_attr_name_test() ->
{<<"html">>, [ { <<"=">>, <<"=">> }, { <<"black">>, <<"black">> } ], [] },
mochiweb_html:parse(D0)),
ok.
+
+parse_broken_pi_test() ->
+ D0 = <<"">>,
+ ?assertEqual(
+ {<<"html">>, [], [
+ { pi, <<"xml:namespace">>, [ { <<"prefix">>, <<"o">> },
+ { <<"ns">>, <<"urn:schemas-microsoft-com:office:office">> } ] }
+ ] },
+ mochiweb_html:parse(D0)),
+ ok.
+
+parse_funny_singletons_test() ->
+ D0 = <<"x">>,
+ ?assertEqual(
+ {<<"html">>, [], [
+ { <<"input">>, [], [] },
+ { <<"input">>, [], [ <<"x">> ] }
+ ] },
+ mochiweb_html:parse(D0)),
+ ok.
-endif.