From bc103fcaa404c3fabd902259e170f18f2f183738 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Wed, 30 Sep 2015 11:16:04 -0700 Subject: [PATCH] Fix: Index out of bounds for incomplete attribute value - #555 - Added a unit and a code generation test --- .../TagHelpers/TagHelperBlockRewriter.cs | 25 +++++------ .../CSharpTagHelperRenderingTest.cs | 9 ++-- .../TagHelpers/TagHelperBlockRewriterTest.cs | 13 +++++- .../Output/IncompleteTagHelper.cs | 44 +++++++++++++++++++ .../Source/IncompleteTagHelper.cshtml | 3 ++ 5 files changed, 73 insertions(+), 21 deletions(-) create mode 100644 test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Output/IncompleteTagHelper.cs create mode 100644 test/Microsoft.AspNet.Razor.Test/TestFiles/CodeGenerator/Source/IncompleteTagHelper.cshtml diff --git a/src/Microsoft.AspNet.Razor/Parser/TagHelpers/TagHelperBlockRewriter.cs b/src/Microsoft.AspNet.Razor/Parser/TagHelpers/TagHelperBlockRewriter.cs index d4fa1053e4..b7763cc7e0 100644 --- a/src/Microsoft.AspNet.Razor/Parser/TagHelpers/TagHelperBlockRewriter.cs +++ b/src/Microsoft.AspNet.Razor/Parser/TagHelpers/TagHelperBlockRewriter.cs @@ -215,34 +215,29 @@ namespace Microsoft.AspNet.Razor.Parser.TagHelpers.Internal // The coming symbols will either be a quote or value (in the case that the value is unquoted). - // TODO: Handle malformed tags, if there's an '=' then there MUST be a value. - // https://github.com/aspnet/Razor/issues/104 - SourceLocation symbolStartLocation; // Skip the whitespace preceding the start of the attribute value. - var valueStartIndex = i + 1; // Start from the symbol after '='. - while (valueStartIndex < htmlSymbols.Length && - (htmlSymbols[valueStartIndex].Type == HtmlSymbolType.WhiteSpace || - htmlSymbols[valueStartIndex].Type == HtmlSymbolType.NewLine)) + do { - valueStartIndex++; - } + i++; // Start from the symbol after '='. + } while (i < htmlSymbols.Length && + (htmlSymbols[i].Type == HtmlSymbolType.WhiteSpace || + htmlSymbols[i].Type == HtmlSymbolType.NewLine)); // Check for attribute start values, aka single or double quote - if (valueStartIndex < htmlSymbols.Length && IsQuote(htmlSymbols[valueStartIndex])) + if (i < htmlSymbols.Length && IsQuote(htmlSymbols[i])) { - // Move past the attribute start so we can accept the true value. - valueStartIndex++; - symbolStartLocation = htmlSymbols[valueStartIndex].Start; + symbolStartLocation = htmlSymbols[i].Start; // If there's a start quote then there must be an end quote to be valid, skip it. symbolOffset = 1; - - i = valueStartIndex - 1; } else { + // We are at the symbol after equals. Go back to equals to ensure we don't skip past that symbol. + i--; + symbolStartLocation = symbol.Start; } diff --git a/test/Microsoft.AspNet.Razor.Test/CodeGenerators/CSharpTagHelperRenderingTest.cs b/test/Microsoft.AspNet.Razor.Test/CodeGenerators/CSharpTagHelperRenderingTest.cs index f001633b00..700c143b5b 100644 --- a/test/Microsoft.AspNet.Razor.Test/CodeGenerators/CSharpTagHelperRenderingTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/CodeGenerators/CSharpTagHelperRenderingTest.cs @@ -920,9 +920,9 @@ namespace Microsoft.AspNet.Razor.Test.Generator characterOffsetIndex: 14, contentLength: 11), BuildLineMapping( - documentAbsoluteIndex: 63, + documentAbsoluteIndex: 62, documentLineIndex: 3, - documentCharacterOffsetIndex: 27, + documentCharacterOffsetIndex: 26, generatedAbsoluteIndex: 1289, generatedLineIndex: 39, generatedCharacterOffsetIndex: 28, @@ -935,9 +935,9 @@ namespace Microsoft.AspNet.Razor.Test.Generator characterOffsetIndex: 30, contentLength: 0), BuildLineMapping( - documentAbsoluteIndex: 89, + documentAbsoluteIndex: 88, documentLineIndex: 4, - documentCharacterOffsetIndex: 13, + documentCharacterOffsetIndex: 12, generatedAbsoluteIndex: 1789, generatedLineIndex: 54, generatedCharacterOffsetIndex: 19, @@ -1650,6 +1650,7 @@ namespace Microsoft.AspNet.Razor.Test.Generator // Note: The baseline resource name is equivalent to the test resource name. return new TheoryData> { + { "IncompleteTagHelper", null, DefaultPAndInputTagHelperDescriptors }, { "SingleTagHelper", null, DefaultPAndInputTagHelperDescriptors }, { "SingleTagHelperWithNewlineBeforeAttributes", null, DefaultPAndInputTagHelperDescriptors }, { "TagHelpersWithWeirdlySpacedAttributes", null, DefaultPAndInputTagHelperDescriptors }, diff --git a/test/Microsoft.AspNet.Razor.Test/TagHelpers/TagHelperBlockRewriterTest.cs b/test/Microsoft.AspNet.Razor.Test/TagHelpers/TagHelperBlockRewriterTest.cs index acddce1e83..cd64e29c8c 100644 --- a/test/Microsoft.AspNet.Razor.Test/TagHelpers/TagHelperBlockRewriterTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/TagHelpers/TagHelperBlockRewriterTest.cs @@ -377,12 +377,21 @@ namespace Microsoft.AspNet.Razor.TagHelpers return new TheoryData { { - "

", + "