From e9c8fbbbaadd7dddd74ffd84f09b3eaf785e59b9 Mon Sep 17 00:00:00 2001 From: InusualZ Date: Sun, 20 Dec 2020 19:34:13 +0000 Subject: [PATCH] Fix TokenWriter::WriteString not escaping properly special characters --- .../Writer/TokenWriterTests.cs | 30 +++++++++++++++++++ src/UglyToad.PdfPig/Writer/TokenWriter.cs | 8 +++++ 2 files changed, 38 insertions(+) create mode 100644 src/UglyToad.PdfPig.Tests/Writer/TokenWriterTests.cs diff --git a/src/UglyToad.PdfPig.Tests/Writer/TokenWriterTests.cs b/src/UglyToad.PdfPig.Tests/Writer/TokenWriterTests.cs new file mode 100644 index 00000000..017a9b80 --- /dev/null +++ b/src/UglyToad.PdfPig.Tests/Writer/TokenWriterTests.cs @@ -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); + } + } + } + } +} diff --git a/src/UglyToad.PdfPig/Writer/TokenWriter.cs b/src/UglyToad.PdfPig/Writer/TokenWriter.cs index 89f95944..88c53482 100644 --- a/src/UglyToad.PdfPig/Writer/TokenWriter.cs +++ b/src/UglyToad.PdfPig/Writer/TokenWriter.cs @@ -16,6 +16,8 @@ /// 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) {