Fix ShellStream when receiving data larger than buffer length (#1337)

This commit is contained in:
Rob Hague
2024-02-24 08:25:54 +00:00
committed by GitHub
parent 5b9c669f1b
commit 69f145159a
2 changed files with 16 additions and 2 deletions
+2 -2
View File
@@ -75,7 +75,7 @@ namespace Renci.SshNet
Debug.Assert(Monitor.IsEntered(_sync), $"Should be in lock on {nameof(_sync)}");
Debug.Assert(_readHead >= 0, $"{nameof(_readHead)} should be non-negative but is {_readHead}");
Debug.Assert(_readTail >= 0, $"{nameof(_readTail)} should be non-negative but is {_readTail}");
Debug.Assert(_readHead < _readBuffer.Length || _readBuffer.Length == 0, $"{nameof(_readHead)} should be < {nameof(_readBuffer)}.Length but is {_readHead}");
Debug.Assert(_readHead <= _readBuffer.Length, $"{nameof(_readHead)} should be <= {nameof(_readBuffer)}.Length but is {_readHead}");
Debug.Assert(_readTail <= _readBuffer.Length, $"{nameof(_readTail)} should be <= {nameof(_readBuffer)}.Length but is {_readTail}");
Debug.Assert(_readHead <= _readTail, $"Should have {nameof(_readHead)} <= {nameof(_readTail)} but have {_readHead} <= {_readTail}");
}
@@ -938,7 +938,7 @@ namespace Renci.SshNet
else
{
// Otherwise, we're gonna need a bigger buffer.
var newBuffer = new byte[_readBuffer.Length * 2];
var newBuffer = new byte[Math.Max(newLength, _readBuffer.Length * 2)];
Buffer.BlockCopy(_readBuffer, _readHead, newBuffer, 0, _readTail - _readHead);
_readBuffer = newBuffer;
}
@@ -9,6 +9,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using Renci.SshNet.Abstractions;
using Renci.SshNet.Channels;
using Renci.SshNet.Common;
@@ -70,6 +71,19 @@ namespace Renci.SshNet.Tests.Classes
CollectionAssert.AreEqual(Encoding.UTF8.GetBytes("orld!llo W\0\0"), buffer);
}
[TestMethod]
public void Channel_DataReceived_MoreThanBufferSize()
{
// Test buffer resizing
byte[] expectedData = CryptoAbstraction.GenerateRandom(BufferSize * 3);
_channelSessionStub.Receive(expectedData);
byte[] actualData = new byte[expectedData.Length + 1];
Assert.AreEqual(expectedData.Length, _shellStream.Read(actualData, 0, actualData.Length));
CollectionAssert.AreEqual(expectedData, actualData.Take(expectedData.Length));
}
[DataTestMethod]
[DataRow("\r\n")]
[DataRow("\r")]