Skip to content

Read past end of buffer. in ColumnCountPayload #1398

@trejjam

Description

@trejjam

Software versions
MySqlConnector version: 2.3.1
Server type (MySQL, MariaDB, Aurora, etc.) and version: 10.6.5-MariaDB-1:10.6.5+maria~stretch
.NET version: 7.0
ORM: EntityFramework 7.0.14

Describe the bug
The server indicates the MariaDbCacheMetadata capability.

(MySqlConnector.Protocol.Payloads.ColumnCountPayload.Create() is called with the following arguments new [1] { 2 }.AsSpan(), true. The first parameter is sent as new [1] { 1, 1 }.AsSpan() which works fine.

var reader = new ByteArrayReader(span);
var columnCount = (int) reader.ReadLengthEncodedInteger();

// since `supportsOptionalMetadata is false` `reader.ReadByte()` is evaluated which causes the exception
var metadataFollows = !supportsOptionalMetadata || reader.ReadByte() == 1;
return new ColumnCountPayload(columnCount, metadataFollows);

Exception
System.InvalidOperationException
Read past end of buffer.

System.InvalidOperationException: Read past end of buffer.
  File "/_/src/MySqlConnector/Protocol/Serialization/ByteArrayReader.cs", line 158, col 4, in void ByteArrayReader.VerifyRead(int length)
  File "/_/src/MySqlConnector/Protocol/Serialization/ByteArrayReader.cs", line 22, col 3, in byte ByteArrayReader.ReadByte()
  File "/_/src/MySqlConnector/Protocol/Payloads/ColumnCountPayload.cs", line 24, col 3, in ColumnCountPayload ColumnCountPayload.Create(ReadOnlySpan<byte> span, bool supportsOptionalMetadata)
  File "/_/src/MySqlConnector/Core/ResultSet.cs", line 117, col 6, in async Task ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior)
MySqlConnector.MySqlException: Failed to read the result set.
  File "/_/src/MySqlConnector/MySqlDataReader.cs", line 133, col 4, in void MySqlDataReader.ActivateResultSet(CancellationToken cancellationToken)
  File "/_/src/MySqlConnector/MySqlDataReader.cs", line 487, col 4, in async Task MySqlDataReader.InitAsync(CommandListPosition commandListPosition, ICommandPayloadCreator payloadCreator, IDictionary<string, CachedProcedure> cachedProcedures, IMySqlCommand command, CommandBehavior behavior, Activity activity, IOBehavior io...
  File "/_/src/MySqlConnector/Core/CommandExecutor.cs", line 56, col 5, in async Task<MySqlDataReader> CommandExecutor.ExecuteReaderAsync(IReadOnlyList<IMySqlCommand> commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken)
  File "/_/src/MySqlConnector/MySqlCommand.cs", line 345, col 3, in async Task<MySqlDataReader> MySqlCommand.ExecuteReaderAsync(CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken)
  File "/_/src/MySqlConnector/MySqlCommand.cs", line 279, col 3, in DbDataReader MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
  File "RelationalCommand.cs", line 533, in RelationalDataReader RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
    reader = interceptionResult.HasResult
  File "SingleQueryingEnumerable.cs", line 240, in bool Enumerator.InitializeReader(Enumerator enumerator)
    var dataReader = enumerator._dataReader = relationalCommand.ExecuteReader(
  File "SingleQueryingEnumerable.cs", line 168, in bool Enumerator.MoveNext()+(DbContext _, Enumerator enumerator) => { }
    this, static (_, enumerator) => InitializeReader(enumerator), null);
  ?, in TResult MySqlExecutionStrategy.Execute<TState, TResult>(TState state, Func<DbContext, TState, TResult> operation, Func<DbContext, TState, ExecutionResult<TResult>> verifySucceeded)
  File "SingleQueryingEnumerable.cs", line 167, in bool Enumerator.MoveNext()
    _relationalQueryContext.ExecutionStrategy.Execute(

Code sample

Execute query:

SELECT `MigrationId`, `ProductVersion`
FROM `__EFMigrationsHistory`
ORDER BY `MigrationId`;

Expected behavior
Do not throw an exception.

Additional context
I tried several servers and only one suffers with this. Even the same Mariadb version running in a docker works.

I do not know Mariadb protocol internals.

The issue appears with 2.3.0-beta.2. 2.3.0-beta.1 work fine.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions