Skip to content

Commit 2107f77

Browse files
committed
Fix invalid XML entity handling in attributes
1 parent fdf519c commit 2107f77

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

src/AngleSharp.Xml.Tests/Tokenizer/XmlTokenization.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,5 +182,34 @@ public void XmlTokenizerTagWithAttributeContainingEntity()
182182
Assert.AreEqual("bar", foo.Attributes[0].Key);
183183
Assert.AreEqual("\"quz\"", foo.Attributes[0].Value);
184184
}
185+
186+
[Test]
187+
public void XmlTokenizerTagWithInvalidReferenceThrows()
188+
{
189+
var s = new TextSource("<foo bar=\"&#34\" baz=\"123\"/>");
190+
var t = CreateTokenizer(s);
191+
t.IsSuppressingErrors = false;
192+
Assert.Throws<XmlParseException>(() => t.Get());
193+
}
194+
195+
196+
[Test]
197+
public void XmlTokenizerTagWithInvalidReferenceSuppresses()
198+
{
199+
var s = new TextSource("<foo bar=\"&#34\" baz=\"123\">");
200+
var t = CreateTokenizer(s);
201+
t.IsSuppressingErrors = true;
202+
var foo = t.Get() as XmlTagToken;
203+
204+
Assert.IsNotNull(foo);
205+
Assert.AreEqual(XmlTokenType.StartTag, foo.Type);
206+
Assert.IsFalse(foo.IsSelfClosing);
207+
Assert.AreEqual("foo", foo.Name);
208+
Assert.AreEqual(2, foo.Attributes.Count);
209+
Assert.AreEqual("bar", foo.Attributes[0].Key);
210+
Assert.AreEqual("&#34", foo.Attributes[0].Value);
211+
Assert.AreEqual("baz", foo.Attributes[1].Key);
212+
Assert.AreEqual("123", foo.Attributes[1].Value);
213+
}
185214
}
186215
}

src/AngleSharp.Xml/Parser/XmlTokenizer.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,23 @@ private String CharacterReference()
247247
if (!IsSuppressingErrors)
248248
throw XmlParseError.CharacterReferenceNotTerminated.At(GetCurrentPosition());
249249

250-
StringBuffer.Insert(start, Symbols.Ampersand);
250+
if (c == Symbols.DoubleQuote)
251+
{
252+
this.Back();
253+
}
254+
255+
StringBuffer.Insert(start++, Symbols.Ampersand);
256+
257+
if (numeric)
258+
{
259+
StringBuffer.Insert(start++, Symbols.Num);
260+
}
261+
262+
if (hex)
263+
{
264+
StringBuffer.Insert(start++, 'x');
265+
}
266+
251267
return String.Empty;
252268
}
253269

0 commit comments

Comments
 (0)