Fix TokenWriter::WriteString not escaping properly special characters

This commit is contained in:
InusualZ
2020-12-20 19:34:13 +00:00
parent 237fd96f9e
commit e9c8fbbbaa
2 changed files with 38 additions and 0 deletions

View File

@@ -0,0 +1,30 @@
namespace UglyToad.PdfPig.Tests.Writer
{
using Integration;
using PdfPig.Writer;
using System.IO;
using UglyToad.PdfPig.Tokens;
using Xunit;
public class TokenWriterTests
{
[Fact]
public void EscapeSpecialCharacter()
{
using (var memStream = new MemoryStream())
{
TokenWriter.WriteToken(new StringToken("\\"), memStream);
TokenWriter.WriteToken(new StringToken("(Hello)"), memStream);
// Read Test
memStream.Position = 0;
using (var streamReader = new StreamReader(memStream))
{
var line = streamReader.ReadToEnd();
Assert.Equal("(\\\\) (\\(Hello\\)) ", line);
}
}
}
}
}

View File

@@ -16,6 +16,8 @@
/// </summary>
public class TokenWriter
{
private static readonly byte Backslash = GetByte("\\");
private static readonly byte ArrayStart = GetByte("[");
private static readonly byte ArrayEnd = GetByte("]");
@@ -374,6 +376,12 @@
for (var i = 0; i < stringToken.Data.Length; i++)
{
var c = stringToken.Data[i];
if (c == (char) StringStart || c == (char)StringEnd || c == (char) Backslash)
{
stringToken = new StringToken(stringToken.Data.Insert(i++, "\\"), stringToken.EncodedWith);
}
// Close enough.
if (c > 250)
{