Skip to content

Commit 986cdb9

Browse files
authored
Prevent connections to SQL 7.0 & 2000 (#2839)
1 parent 44cfedd commit 986cdb9

File tree

4 files changed

+58
-23
lines changed

4 files changed

+58
-23
lines changed

src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/TdsParser.cs

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3988,25 +3988,6 @@ private TdsOperationStatus TryProcessLoginAck(TdsParserStateObject stateObj, out
39883988
// information provided by S. Ashwin
39893989
switch (majorMinor)
39903990
{
3991-
case TdsEnums.SQL70OR2000_MAJOR << 24 | TdsEnums.DEFAULT_MINOR: // 7.0 & 2000 RTM
3992-
// note that 7.0 and 2000 can only be distinguished by the increment
3993-
switch (increment)
3994-
{
3995-
case TdsEnums.SQL2000_INCREMENT:
3996-
_is2000 = true;
3997-
break;
3998-
case TdsEnums.SQL70_INCREMENT:
3999-
// no flag will be set
4000-
break;
4001-
default:
4002-
throw SQL.InvalidTDSVersion();
4003-
}
4004-
break;
4005-
case TdsEnums.SQL2000SP1_MAJOR << 24 | TdsEnums.SQL2000SP1_MINOR: // 2000 SP1
4006-
if (increment != TdsEnums.SQL2000SP1_INCREMENT)
4007-
{ throw SQL.InvalidTDSVersion(); }
4008-
_is2000SP1 = true;
4009-
break;
40103991
case TdsEnums.SQL2005_MAJOR << 24 | TdsEnums.SQL2005_RTM_MINOR: // 2005
40113992
if (increment != TdsEnums.SQL2005_INCREMENT)
40123993
{

src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConnectionBasicTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,5 +492,37 @@ public void ConnectionTestAccessTokenCallbackCombinations()
492492
});
493493
}
494494
}
495+
496+
[Theory]
497+
[InlineData(9, 0, 2047)] // SQL Server 2005
498+
[InlineData(10, 0, 2531)] // SQL Server 2008
499+
[InlineData(10, 50, 2500)] // SQL Server 2008 R2
500+
[InlineData(11, 0, 3000)] // SQL Server 2012-2022
501+
public void ConnectionTestPermittedVersion(int major, int minor, int build)
502+
{
503+
Version simulatedServerVersion = new Version(major, minor, build);
504+
using TestTdsServer server = TestTdsServer.StartTestServer(serverVersion: simulatedServerVersion);
505+
using SqlConnection conn = new SqlConnection(server.ConnectionString);
506+
507+
conn.Open();
508+
Assert.Equal(ConnectionState.Open, conn.State);
509+
510+
Version returnedServerVersion = Version.Parse(conn.ServerVersion);
511+
512+
Assert.Equal(simulatedServerVersion, returnedServerVersion);
513+
}
514+
515+
[Theory]
516+
[InlineData(7, 0, 623)] // SQL Server 7.0
517+
[InlineData(8, 0, 194)] // SQL Server 2000 RTM
518+
[InlineData(8, 0, 384)] // SQL Server 2000 SP1
519+
public void ConnectionTestDeniedVersion(int major, int minor, int build)
520+
{
521+
Version simulatedServerVersion = new Version(major, minor, build);
522+
using TestTdsServer server = TestTdsServer.StartTestServer(serverVersion: simulatedServerVersion);
523+
using SqlConnection conn = new SqlConnection(server.ConnectionString);
524+
525+
Assert.Throws<InvalidOperationException>(() => conn.Open());
526+
}
495527
}
496528
}

src/Microsoft.Data.SqlClient/tests/FunctionalTests/TestTdsServer.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public TestTdsServer(QueryEngine engine, TDSServerArguments args) : base(args)
2525
Engine = engine;
2626
}
2727

28-
public static TestTdsServer StartServerWithQueryEngine(QueryEngine engine, bool enableFedAuth = false, bool enableLog = false, int connectionTimeout = DefaultConnectionTimeout, bool excludeEncryption = false, [CallerMemberName] string methodName = "")
28+
public static TestTdsServer StartServerWithQueryEngine(QueryEngine engine, bool enableFedAuth = false, bool enableLog = false, int connectionTimeout = DefaultConnectionTimeout, bool excludeEncryption = false, Version serverVersion = null, [CallerMemberName] string methodName = "")
2929
{
3030
TDSServerArguments args = new TDSServerArguments()
3131
{
@@ -40,6 +40,10 @@ public static TestTdsServer StartServerWithQueryEngine(QueryEngine engine, bool
4040
{
4141
args.Encryption = SqlServer.TDS.PreLogin.TDSPreLoginTokenEncryptionType.None;
4242
}
43+
if (serverVersion != null)
44+
{
45+
args.ServerVersion = serverVersion;
46+
}
4347

4448
TestTdsServer server = engine == null ? new TestTdsServer(args) : new TestTdsServer(engine, args);
4549
server._endpoint = new TDSServerEndPoint(server) { ServerEndPoint = new IPEndPoint(IPAddress.Any, 0) };
@@ -58,9 +62,9 @@ public static TestTdsServer StartServerWithQueryEngine(QueryEngine engine, bool
5862
return server;
5963
}
6064

61-
public static TestTdsServer StartTestServer(bool enableFedAuth = false, bool enableLog = false, int connectionTimeout = DefaultConnectionTimeout, bool excludeEncryption = false, [CallerMemberName] string methodName = "")
65+
public static TestTdsServer StartTestServer(bool enableFedAuth = false, bool enableLog = false, int connectionTimeout = DefaultConnectionTimeout, bool excludeEncryption = false, Version serverVersion = null, [CallerMemberName] string methodName = "")
6266
{
63-
return StartServerWithQueryEngine(null, enableFedAuth, enableLog, connectionTimeout, excludeEncryption, methodName);
67+
return StartServerWithQueryEngine(null, enableFedAuth, enableLog, connectionTimeout, excludeEncryption, serverVersion, methodName);
6468
}
6569

6670
public void Dispose() => _endpoint?.Stop();

src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS/TDSVersion.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,16 @@ namespace Microsoft.SqlServer.TDS
1111
/// </summary>
1212
public static class TDSVersion
1313
{
14+
/// <summary>
15+
/// 7.0 (Sphinx) TDS version
16+
/// </summary>
17+
public static Version SqlServer7_0 = new Version(7, 0, 0, 0);
18+
19+
/// <summary>
20+
/// 2000 (Shiloh) TDS version
21+
/// </summary>
22+
public static Version SqlServer2000 = new Version(7, 1, 0, 1);
23+
1424
/// <summary>
1525
/// 2005 (Yukon) TDS version
1626
/// </summary>
@@ -46,6 +56,14 @@ public static Version GetTDSVersion(Version buildVersion)
4656
{
4757
return SqlServer2005;
4858
}
59+
else if (buildVersion.Major == 8)
60+
{
61+
return SqlServer2000;
62+
}
63+
else if (buildVersion.Major == 7)
64+
{
65+
return SqlServer7_0;
66+
}
4967
else
5068
{
5169
// Not supported TDS version
@@ -79,7 +97,7 @@ public static Version Resolve(Version tdsServer, Version tdsClient)
7997
/// </summary>
8098
public static bool IsSupported(Version tdsVersion)
8199
{
82-
return tdsVersion >= SqlServer2005 && tdsVersion <= SqlServer2012;
100+
return tdsVersion >= SqlServer7_0 && tdsVersion <= SqlServer2012;
83101
}
84102
}
85103
}

0 commit comments

Comments
 (0)