runtime: Regression in System.Data.SqlClient >= 4.7.0-preview7 on Docker

The newest versions of System.Data.SqlClient throws when connecting to SQL Azure when running inside a Docker linux container.

  • 4.7.0-preview6.19303.8 does not throw
  • 4.7.0-preview7.19362.9 and 4.7.0-preview8.19405.3 throws when run in Docker

I have tried both the debian and alpine images and both seems to produce the exception. The code works fine on Windows. I have also not seen any issues when connecting to a “real” SQL Server, but I have not investigated this thoroughly.

image

The reproducing code is the following:

using System.Data.SqlClient;

namespace Repro145
{
    class Program
    {
        static void Main()
        {
            using (var connection = new SqlConnection(ConnectionString))
            {
                connection.Open();

                var command = new SqlCommand("SELECT * FROM Catalog.Device", connection);

                // System.Data.SqlClient 4.7.0-preview7.19362.9 and later throws when run in Docker
                // System.Data.SqlClient 4.7.0-preview6.19303.8 does not throw
                var reader = command.ExecuteReader();

                while (reader.Read()) ;

                connection.Close();
            }
        }

        private const string ConnectionString = "Server=tcp:xxx.database.windows.net,1433;Initial Catalog=xxx;Persist Security Info=False;User ID=xxx;Password=xxx;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;";
    }
}

.csproj file
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.9.2" />
    
    <!-- Does not throw -->
    <!--<PackageReference Include="System.Data.SqlClient" Version="4.7.0-preview6.19303.8" />-->
    
    <!-- Throws -->
    <PackageReference Include="System.Data.SqlClient" Version="4.7.0-preview7.19362.9" />
    
  </ItemGroup>

</Project>
Dockerfile
FROM mcr.microsoft.com/dotnet/core/runtime:3.0.0-preview8-buster-slim AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/core/sdk:3.0.0-preview8-buster AS build
WORKDIR /src
COPY ["Repro145/Repro145.csproj", "Repro145/"]
RUN dotnet restore "Repro145/Repro145.csproj"
COPY . .
WORKDIR "/src/Repro145"
RUN dotnet build "Repro145.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Repro145.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Repro145.dll"]
Full stacktrace
System.Data.SqlClient.SqlException
  HResult=0x80131904
  Message=A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 35 - An internal exception was caught)
  Source=Core .Net SqlClient Data Provider
  StackTrace:
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParserStateObject.ThrowExceptionAndWarning(Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
   at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
   at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite, String method)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.SqlClient.SqlCommand.ExecuteReader()
   at Repro145.Program.Main() in C:\Source\repro145\Repro145\Program.cs:line 17

Inner Exception 1:
IOException: The decryption operation failed, see inner exception.

Inner Exception 2:
SslException: Decrypt failed with OpenSSL error - SSL_ERROR_SSL.

Inner Exception 3:
OpenSslCryptographicException: error:1408F10B:SSL routines:ssl3_get_record:wrong version number

This issue is related to https://github.com/dotnet/SqlClient/issues/145 for the Microsoft.Data.SqlClient equivalent.

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Reactions: 1
  • Comments: 51 (44 by maintainers)

Most upvoted comments

It’s fixed I believe. @cheenamalhotra feel free to close

Confirmed the nightly build 4.7.0-rc2.19455.22 now works on MacOS 😁 Great work all!

@danmosemsft @ericstj The regression issue has been fixed and PR dotnet/corefx#40732 merged.

@wfurt @rmja The latest master branch source code fixes the problem now, please test and let us know for any other concerns. We are also considering to port over the performance improvements in Microsoft.Data.SqlClient (NetCore) with dotnet/sqlclient#173 soon.

Sounds like the best thing to do for 3.0 is revert the offending PR.

cc: @ericstj