Skip to content

Commit

Permalink
Stop throwing exception when writing 0 length buffers (#32277) (#32470)
Browse files Browse the repository at this point in the history
## Description
Update guard logic to permit writing 0 length buffers. This can happen in certain globalized scenarios (ex. `¿` with Portugese) where the first char needs to be encoded.

Patch #31299 for 5.0 by cherry-picking the #32277 squash commit.


## Customer Impact
Writing 0-length char buffers leads to an ArgumentOutOfRangeException. This may occur in a globalization context with certain chars such as `¿`.

#31299 (comment)

Also impacts Orchard: #31299 (comment)


## Regression?
- [ ] Yes
- [x] No

[If yes, specify the version the behavior has regressed from]

## Risk
- [ ] High
- [ ] Medium
- [x] Low

Low risk as we've just updated the logic slightly to permit 0 length buffers.

## Verification
- [x] Manual (required)
- [x] Automated

## Packaging changes reviewed?
- [ ] Yes
- [ ] No
- [x] N/A


Addresses #31299
  • Loading branch information
TanayParikh committed May 9, 2021
1 parent e6998cb commit b124d50
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 4 deletions.
11 changes: 8 additions & 3 deletions src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBufferTextWriter.cs
Expand Up @@ -110,16 +110,21 @@ public override void Write(char[] buffer, int index, int count)
throw new ArgumentNullException(nameof(buffer));
}

if (index < 0 || index >= buffer.Length)
if (index < 0)
{
throw new ArgumentOutOfRangeException(nameof(index));
}

if (count < 0 || (buffer.Length - index < count))
if (count < 0)
{
throw new ArgumentOutOfRangeException(nameof(count));
}

if (buffer.Length - index < count)
{
throw new ArgumentOutOfRangeException(nameof(buffer.Length));
}

Buffer.AppendHtml(new string(buffer, index, count));
}

Expand Down Expand Up @@ -326,4 +331,4 @@ public override async Task FlushAsync()
await _inner.FlushAsync();
}
}
}
}
Expand Up @@ -124,6 +124,22 @@ public async Task WriteLines_WritesCharBuffer()
Assert.Equal<object>(new[] { newLine, newLine }, actual);
}

[Fact]
public void Write_WritesEmptyCharBuffer()
{
// Arrange
var buffer = new ViewBuffer(new TestViewBufferScope(), "some-name", pageSize: 4);
var writer = new ViewBufferTextWriter(buffer, Encoding.UTF8);
var charBuffer = new char[0];

// Act
writer.Write(charBuffer, 0, 0);

// Assert
var actual = GetValues(buffer);
Assert.Equal<object>(new[] { string.Empty }, actual);
}

[Fact]
public async Task Write_WritesStringBuffer()
{
Expand Down Expand Up @@ -170,4 +186,4 @@ public override string ToString()
}
}
}
}
}

0 comments on commit b124d50

Please sign in to comment.