From 580759265fb47b28dc7228ac6732f691d67a1177 Mon Sep 17 00:00:00 2001 From: DavoudEshtehari <61173489+DavoudEshtehari@users.noreply.github.com> Date: Tue, 23 Aug 2022 12:58:33 -0700 Subject: [PATCH] [Hotfix 2.1.5] | Shim gss api on Linux to delay loading libgssapi_krb5.so (#1411) (#1727) --- .../Interop.NetSecurityNative.cs | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Unix/System.Net.Security.Native/Interop.NetSecurityNative.cs b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Unix/System.Net.Security.Native/Interop.NetSecurityNative.cs index ab8338e796..489d1cf8a9 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Unix/System.Net.Security.Native/Interop.NetSecurityNative.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Common/src/Interop/Unix/System.Net.Security.Native/Interop.NetSecurityNative.cs @@ -11,49 +11,52 @@ internal static partial class Interop { internal static partial class NetSecurityNative { - [DllImport(Libraries.NetSecurityNative, EntryPoint="NetSecurityNative_ReleaseGssBuffer")] + [DllImport(Libraries.NetSecurityNative, EntryPoint = "NetSecurityNative_ReleaseGssBuffer")] internal static extern void ReleaseGssBuffer( IntPtr bufferPtr, ulong length); - [DllImport(Libraries.NetSecurityNative, EntryPoint="NetSecurityNative_DisplayMinorStatus")] + [DllImport(Interop.Libraries.NetSecurityNative, EntryPoint = "NetSecurityNative_EnsureGssInitialized")] + private static extern int EnsureGssInitialized(); + + [DllImport(Libraries.NetSecurityNative, EntryPoint = "NetSecurityNative_DisplayMinorStatus")] internal static extern Status DisplayMinorStatus( out Status minorStatus, Status statusValue, ref GssBuffer buffer); - [DllImport(Libraries.NetSecurityNative, EntryPoint="NetSecurityNative_DisplayMajorStatus")] + [DllImport(Libraries.NetSecurityNative, EntryPoint = "NetSecurityNative_DisplayMajorStatus")] internal static extern Status DisplayMajorStatus( out Status minorStatus, Status statusValue, ref GssBuffer buffer); - [DllImport(Libraries.NetSecurityNative, EntryPoint="NetSecurityNative_ImportUserName")] + [DllImport(Libraries.NetSecurityNative, EntryPoint = "NetSecurityNative_ImportUserName")] internal static extern Status ImportUserName( out Status minorStatus, string inputName, int inputNameByteCount, out SafeGssNameHandle outputName); - [DllImport(Libraries.NetSecurityNative, EntryPoint="NetSecurityNative_ImportPrincipalName")] + [DllImport(Libraries.NetSecurityNative, EntryPoint = "NetSecurityNative_ImportPrincipalName")] internal static extern Status ImportPrincipalName( out Status minorStatus, string inputName, int inputNameByteCount, out SafeGssNameHandle outputName); - [DllImport(Libraries.NetSecurityNative, EntryPoint="NetSecurityNative_ReleaseName")] + [DllImport(Libraries.NetSecurityNative, EntryPoint = "NetSecurityNative_ReleaseName")] internal static extern Status ReleaseName( out Status minorStatus, ref IntPtr inputName); - [DllImport(Libraries.NetSecurityNative, EntryPoint="NetSecurityNative_InitiateCredSpNego")] + [DllImport(Libraries.NetSecurityNative, EntryPoint = "NetSecurityNative_InitiateCredSpNego")] internal static extern Status InitiateCredSpNego( out Status minorStatus, SafeGssNameHandle desiredName, out SafeGssCredHandle outputCredHandle); - [DllImport(Libraries.NetSecurityNative, EntryPoint="NetSecurityNative_InitiateCredWithPassword")] + [DllImport(Libraries.NetSecurityNative, EntryPoint = "NetSecurityNative_InitiateCredWithPassword")] internal static extern Status InitiateCredWithPassword( out Status minorStatus, bool isNtlm, @@ -62,12 +65,12 @@ internal static extern Status InitiateCredWithPassword( int passwordLen, out SafeGssCredHandle outputCredHandle); - [DllImport(Libraries.NetSecurityNative, EntryPoint="NetSecurityNative_ReleaseCred")] + [DllImport(Libraries.NetSecurityNative, EntryPoint = "NetSecurityNative_ReleaseCred")] internal static extern Status ReleaseCred( out Status minorStatus, ref IntPtr credHandle); - [DllImport(Libraries.NetSecurityNative, EntryPoint="NetSecurityNative_InitSecContext")] + [DllImport(Libraries.NetSecurityNative, EntryPoint = "NetSecurityNative_InitSecContext")] internal static extern Status InitSecContext( out Status minorStatus, SafeGssCredHandle initiatorCredHandle, @@ -81,7 +84,7 @@ internal static extern Status InitSecContext( out uint retFlags, out int isNtlmUsed); - [DllImport(Libraries.NetSecurityNative, EntryPoint="NetSecurityNative_DeleteSecContext")] + [DllImport(Libraries.NetSecurityNative, EntryPoint = "NetSecurityNative_DeleteSecContext")] internal static extern Status DeleteSecContext( out Status minorStatus, ref IntPtr contextHandle); @@ -109,5 +112,17 @@ internal enum GssFlags : uint GSS_C_EXTENDED_ERROR_FLAG = 0x4000, GSS_C_DELEG_POLICY_FLAG = 0x8000 } + + // This constructor is added to address the issue with net6 regarding + // Shim gss api on Linux to delay loading libgssapi_krb5.so + // issue https://github.com/dotnet/SqlClient/issues/1390 + // dotnet runtime issue https://github.com/dotnet/runtime/pull/55037 + static NetSecurityNative() + { + if (Environment.Version.Major >= 6) + { + EnsureGssInitialized(); + } + } } }