Skip to content

Commit 8534fb8

Browse files
committed
Throw MySqlProtocolException for short read. Fixes #394
1 parent b098883 commit 8534fb8

File tree

3 files changed

+11
-10
lines changed

3 files changed

+11
-10
lines changed

src/MySqlConnector/MySql.Data.MySqlClient/MySqlProtocolException.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
using System;
1+
using System.IO;
22
using MySqlConnector.Utilities;
33

44
namespace MySql.Data.MySqlClient
55
{
6-
public sealed class MySqlProtocolException : InvalidOperationException
6+
public sealed class MySqlProtocolException : IOException
77
{
8-
internal static MySqlProtocolException CreateForPacketOutOfOrder(int expectedSequenceNumber, int packetSequenceNumber)
9-
{
10-
return new MySqlProtocolException("Packet received out-of-order. Expected {0}; got {1}.".FormatInvariant(expectedSequenceNumber, packetSequenceNumber));
11-
}
8+
internal static MySqlProtocolException CreateForPacketOutOfOrder(int expectedSequenceNumber, int packetSequenceNumber) =>
9+
new MySqlProtocolException("Packet received out-of-order. Expected {0}; got {1}.".FormatInvariant(expectedSequenceNumber, packetSequenceNumber));
10+
11+
internal static MySqlProtocolException CreateForIncompleteRead(int expected, int actual, string beingRead) =>
12+
new MySqlProtocolException("Expected to read {0} bytes but only read {1} when reading {2}".FormatInvariant(expected, actual, beingRead));
1213

1314
private MySqlProtocolException(string message)
1415
: base(message)

src/MySqlConnector/Protocol/Serialization/CompressedPayloadHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ private ValueTask<int> ReadBytesAsync(ArraySegment<byte> buffer, ProtocolErrorBe
8383
{
8484
return protocolErrorBehavior == ProtocolErrorBehavior.Ignore ?
8585
default(ValueTask<int>) :
86-
ValueTaskExtensions.FromException<int>(new EndOfStreamException("Wanted to read 7 bytes but only read {0} when reading compressed packet header".FormatInvariant(headerReadBytes.Count)));
86+
ValueTaskExtensions.FromException<int>(MySqlProtocolException.CreateForIncompleteRead(7, headerReadBytes.Count, "compressed packet header"));
8787
}
8888

8989
var payloadLength = (int) SerializationUtility.ReadUInt32(headerReadBytes.Array, headerReadBytes.Offset, 3);
@@ -118,7 +118,7 @@ private ValueTask<int> ReadBytesAsync(ArraySegment<byte> buffer, ProtocolErrorBe
118118
{
119119
return protocolErrorBehavior == ProtocolErrorBehavior.Ignore ?
120120
default(ValueTask<int>) :
121-
ValueTaskExtensions.FromException<int>(new EndOfStreamException("Wanted to read {0} bytes but only read {1} when reading compressed payload".FormatInvariant(payloadLength, payloadReadBytes.Count)));
121+
ValueTaskExtensions.FromException<int>(MySqlProtocolException.CreateForIncompleteRead(payloadLength, payloadReadBytes.Count, "compressed payload"));
122122
}
123123

124124
if (uncompressedLength == 0)

src/MySqlConnector/Protocol/Serialization/ProtocolUtility.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ private static ValueTask<Packet> ReadPacketAfterHeader(ArraySegment<byte> header
416416
if (headerBytes.Count < 4)
417417
{
418418
return protocolErrorBehavior == ProtocolErrorBehavior.Throw ?
419-
ValueTaskExtensions.FromException<Packet>(new EndOfStreamException("Expected to read 4 header bytes but only received {0}.".FormatInvariant(headerBytes.Count))) :
419+
ValueTaskExtensions.FromException<Packet>(MySqlProtocolException.CreateForIncompleteRead(4, headerBytes.Count, "packet header")) :
420420
default(ValueTask<Packet>);
421421
}
422422

@@ -445,7 +445,7 @@ ValueTask<Packet> AddContinuation(ValueTask<ArraySegment<byte>> payloadBytesTask
445445

446446
private static ValueTask<Packet> CreatePacketFromPayload(ArraySegment<byte> payloadBytes, int payloadLength, ProtocolErrorBehavior protocolErrorBehavior) =>
447447
payloadBytes.Count >= payloadLength ? new ValueTask<Packet>(new Packet(payloadBytes)) :
448-
protocolErrorBehavior == ProtocolErrorBehavior.Throw ? ValueTaskExtensions.FromException<Packet>(new EndOfStreamException("Expected to read {0} payload bytes but only received {1}.".FormatInvariant(payloadLength, payloadBytes.Count))) :
448+
protocolErrorBehavior == ProtocolErrorBehavior.Throw ? ValueTaskExtensions.FromException<Packet>(MySqlProtocolException.CreateForIncompleteRead(payloadLength, payloadBytes.Count, "payload")) :
449449
default(ValueTask<Packet>);
450450

451451
public static ValueTask<ArraySegment<byte>> ReadPayloadAsync(BufferedByteReader bufferedByteReader, IByteHandler byteHandler, Func<int> getNextSequenceNumber, ArraySegmentHolder<byte> cache, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior)

0 commit comments

Comments
 (0)