Skip to content

Commit 4714c2b

Browse files
authored
Merge pull request #8 from kasthack/feature/issue-8-invalid-entity-handling
Fix invalid XML entity handling in attributes / #9 fix
2 parents 4595c86 + 9d94396 commit 4714c2b

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
@@ -183,6 +183,35 @@ public void XmlTokenizerTagWithAttributeContainingEntity()
183183
Assert.AreEqual("\"quz\"", foo.Attributes[0].Value);
184184
}
185185

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+
}
214+
186215
[Test]
187216
public void XmlTokenizerTagThrowsWithADiamond()
188217
{

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)