Fixed: Access Violation when a bucket overflows
This commit is contained in:
parent
2faa65729d
commit
fcd8d4a46d
@ -74,6 +74,12 @@ type
|
||||
procedure testEnumerator(); override;
|
||||
end;
|
||||
|
||||
THashesBugTest = class(TTestCase)
|
||||
published
|
||||
procedure testAccessViolation;
|
||||
end;
|
||||
|
||||
|
||||
implementation
|
||||
uses
|
||||
SysUtils;
|
||||
@ -359,9 +365,182 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
{ THashesBugTest }
|
||||
procedure THashesBugTest.testAccessViolation;
|
||||
const
|
||||
TestValues: array[0..878] of Integer =
|
||||
(
|
||||
2480044, 2480046, 2480174, 2480187, 2480188, 2480210,
|
||||
2490187, 2500044, 2500046, 2500174, 2500187, 2500188,
|
||||
2500210, 2530046, 2530174, 2530187, 2530188, 2530210,
|
||||
2550046, 2550174, 2550187, 2550188, 2550210, 2560046,
|
||||
4920097, 4920098, 4920218, 4930098, 4930099, 4930218,
|
||||
4940097, 4940098, 4950098, 4950099, 4950218, 5070102,
|
||||
5070164, 5090102, 5090164, 5090222, 5100102, 5110102,
|
||||
5110164, 5120102, 5130104, 5130159, 5130177, 5140104,
|
||||
5140105, 5140159, 5140177, 5160159, 5160177, 5210105,
|
||||
5210159, 5210177, 5210184, 5210236, 5210237, 5210238,
|
||||
5210290, 5210297, 5210321, 5220105, 5220159, 5220177,
|
||||
5220184, 5220236, 5220237, 5220238, 5220290, 5220297,
|
||||
5220321, 5240105, 5240159, 5240177, 5240184, 5240236,
|
||||
5240237, 5240238, 5370105, 5370159, 5370177, 5370184,
|
||||
5370236, 5370237, 5370238, 5370290, 5370297, 5380105,
|
||||
5380159, 5380177, 5380184, 5380236, 5380237, 5380238,
|
||||
5380290, 5380297, 5400105, 5400159, 5400177, 5400184,
|
||||
5400236, 5400237, 5400238, 5450107, 5460107, 5480108,
|
||||
5480109, 5480220, 5480238, 5530107, 5530158, 5540107,
|
||||
5540112, 5540158, 5550112, 5550113, 5550176, 5550253,
|
||||
5560108, 5560109, 5560158, 5560176, 5560220, 5560237,
|
||||
5560238, 5690105, 5690107, 5690108, 5690109, 5690176,
|
||||
5690184, 5690220, 5700105, 5700107, 5700112, 5700184,
|
||||
5700220, 5770110, 5790112, 5790114, 5790158, 5800110,
|
||||
5850111, 5930105, 5930107, 5930159, 5930177, 5930184,
|
||||
5940107, 5940238, 5950105, 5950107, 5950159, 5950177,
|
||||
5950184, 5960107, 5960112, 5960158, 5960238, 5980108,
|
||||
5980109, 5980158, 5980220, 5980237, 5980238, 6000112,
|
||||
6000113, 6000176, 6330108, 6330109, 6330176, 6330220,
|
||||
6340105, 6340184, 6350108, 6350109, 6350176, 6350220,
|
||||
6350238, 6360238, 6370108, 6370109, 6370176, 6370220,
|
||||
6370237, 6370238, 6380220, 6380238, 6400119, 6400120,
|
||||
6410119, 6410120, 6410121, 6410125, 6410221, 6420119,
|
||||
6420120, 6420121, 6430119, 6430120, 6430121, 6430221,
|
||||
6430251, 6440119, 6440120, 6440121, 6440124, 6440125,
|
||||
6440221, 6490120, 6490121, 6490125, 6490221, 8290152,
|
||||
8290153, 8290155, 8300152, 8300153, 8300154, 8300155,
|
||||
8300156, 8300157, 8310152, 8310153, 8310154, 8310155,
|
||||
8310156, 8310157, 8320153, 8320154, 8320155, 8320156,
|
||||
8320157, 8330153, 8330154, 8330155, 8330156, 8330157,
|
||||
8330302, 8340152, 8340153, 8340155, 8340255, 8340273,
|
||||
8340275, 8340299, 8340300, 8340335, 8340375, 8350152,
|
||||
8350153, 8350154, 8350155, 8350156, 8350157, 8350256,
|
||||
8350275, 8350299, 8350300, 8350302, 8350335, 8360152,
|
||||
8360153, 8360154, 8360155, 8360156, 8360157, 8370154,
|
||||
8370155, 8370156, 8370157, 8370241, 8370302, 8380152,
|
||||
8380153, 8380155, 8390152, 8390153, 8390154, 8390155,
|
||||
8390156, 8390157, 8400152, 8400153, 8400154, 8400155,
|
||||
8400156, 8400157, 8410153, 8410154, 8410155, 8410156,
|
||||
8410157, 8420153, 8420154, 8420155, 8420156, 8420157,
|
||||
8420302, 8430152, 8430153, 8430155, 8430255, 8430273,
|
||||
8430275, 8430299, 8430300, 8430335, 8430375, 8440152,
|
||||
8440153, 8440154, 8440155, 8440156, 8440157, 8440256,
|
||||
8440275, 8440299, 8440300, 8440302, 8440335, 8450152,
|
||||
8450153, 8450154, 8450155, 8450156, 8450157, 8460154,
|
||||
8460155, 8460156, 8460157, 8460241, 8460302, 8470098,
|
||||
8480102, 8480164, 8490110, 8490158, 8490176, 8490220,
|
||||
8500110, 8500158, 8500176, 8500220, 8600119, 8600120,
|
||||
8600121, 8600124, 8600125, 8600221, 8600251, 8620120,
|
||||
8630119, 8700188, 8700210, 8700211, 8710188, 8710210,
|
||||
8710211, 8720158, 8720220, 8730102, 8730164, 8740102,
|
||||
8740103, 8740164, 8740165, 8780215, 8780216, 8790215,
|
||||
8790216, 8790217, 8800216, 8800217, 8800258, 8800259,
|
||||
8800338, 8810215, 8810216, 8810217, 8810257, 8810258,
|
||||
8810259, 8810281, 8820152, 8820153, 8820154, 8820155,
|
||||
8820156, 8820157, 8830152, 8830153, 8830154, 8830155,
|
||||
8830156, 8830157, 8840152, 8840153, 8840154, 8840155,
|
||||
8840156, 8840157, 8850152, 8850153, 8850154, 8850155,
|
||||
8850156, 8850157, 8930119, 8930120, 8930121, 8950158,
|
||||
8950219, 9150223, 9150224, 9150276, 9160223, 9160224,
|
||||
9160225, 9160276, 9170223, 9170224, 9170225, 9170291,
|
||||
9330223, 9330224, 9340223, 9340224, 9340225, 9340226,
|
||||
9350223, 9350224, 9350225, 9370224, 9380226, 9380229,
|
||||
9380230, 9510224, 9510227, 9520224, 9520225, 9520227,
|
||||
9520254, 9520276, 9530224, 9530225, 9530254, 9530276,
|
||||
9530292, 9550224, 9560227, 9560229, 9560230, 9560254,
|
||||
9560276, 9560292, 9630224, 9640224, 9640225, 9640226,
|
||||
9640254, 9640276, 9650224, 9650225, 9650254, 9650276,
|
||||
9650292, 9680226, 9680229, 9680230, 9690224, 9690254,
|
||||
9690276, 9700224, 9700225, 9700226, 9700254, 9700276,
|
||||
9710224, 9710225, 9710254, 9710276, 9710291, 9710292,
|
||||
9720232, 9740226, 9740229, 9740230, 9740254, 9740276,
|
||||
9740292, 9930227, 9930228, 9940227, 9940228, 9960232,
|
||||
9960233, 9980227, 9980230, 9980292, 9990224, 9990227,
|
||||
10000224, 10000225, 10000227, 10010224, 10010225, 10020232,
|
||||
10020254, 10020293, 10040227, 10040230, 10040254, 10040276,
|
||||
10040292, 10050224, 10050227, 10060224, 10060225, 10060227,
|
||||
10060254, 10060276, 10070224, 10070225, 10070254, 10070276,
|
||||
10070292, 10080232, 10080254, 10080293, 10100227, 10100230,
|
||||
10100254, 10100276, 10100292, 10230228, 10240227, 10240228,
|
||||
10260233, 10350234, 10350235, 10350295, 10350343, 10360235,
|
||||
10360295, 10370234, 10370235, 10370295, 10370343, 10380235,
|
||||
10380295, 10390119, 10390120, 10390121, 10390125, 10390221,
|
||||
10390251, 10390317, 10390342, 10400119, 10400120, 10400121,
|
||||
10400125, 10400221, 10400251, 10400317, 10400342, 10450239,
|
||||
10450240, 10460240, 10470240, 10470241, 10480239, 10480240,
|
||||
10480241, 10500152, 10500153, 10500155, 10500255, 10500273,
|
||||
10500275, 10500299, 10500300, 10500335, 10500375, 10520152,
|
||||
10520153, 10520154, 10520155, 10520156, 10520157, 10520256,
|
||||
10520275, 10520300, 10520302, 10520335, 10520376, 10530152,
|
||||
10530153, 10530154, 10530155, 10530156, 10530157, 10530256,
|
||||
10530275, 10530300, 10530335, 10550152, 10550153, 10550155,
|
||||
10550255, 10550273, 10550275, 10550299, 10550300, 10550335,
|
||||
10550375, 10560152, 10560153, 10560154, 10560155, 10560156,
|
||||
10560157, 10560256, 10560275, 10560300, 10560302, 10560335,
|
||||
10560376, 10570152, 10570153, 10570154, 10570155, 10570156,
|
||||
10570157, 10570256, 10570275, 10570300, 10570335, 10580152,
|
||||
10580153, 10580154, 10580155, 10580156, 10580157, 10580256,
|
||||
10580300, 10580302, 10580335, 10590152, 10590153, 10590154,
|
||||
10590155, 10590156, 10590157, 10590256, 10590300, 10590302,
|
||||
10590335, 10600187, 10600188, 10600210, 10610187, 10610188,
|
||||
10610210, 10630216, 10630217, 10630258, 10630259, 10630281,
|
||||
10640215, 10640216, 10640217, 10640257, 10640258, 10640338,
|
||||
10650215, 10650216, 10650217, 10650257, 10650258, 10650259,
|
||||
10660097, 10660098, 10660218, 10670097, 10670098, 10680098,
|
||||
10680099, 10680218, 10690102, 10690164, 10700102, 10700164,
|
||||
10700222, 10700320, 10710102, 10710103, 10710165, 10720244,
|
||||
10720245, 10720277, 10720309, 10720336, 10720346, 10730244,
|
||||
10730245, 10730246, 10730248, 10730260, 10730277, 10740245,
|
||||
10750246, 10750248, 10750260, 10760246, 10760260, 10760336,
|
||||
10760346, 10770246, 10770260, 10770336, 10770346, 10780247,
|
||||
10780334, 10790244, 10790245, 10790246, 10790277, 10790309,
|
||||
10800244, 10800245, 10800246, 10800260, 10800277, 10810246,
|
||||
10810247, 10810248, 10810260, 10810334, 10810366, 10820244,
|
||||
10820245, 10820246, 10820249, 10820277, 10820309, 10820336,
|
||||
10820346, 10830244, 10830245, 10830246, 10830248, 10830249,
|
||||
10830260, 10830277, 10840245, 10850246, 10850248, 10850249,
|
||||
10850260, 10860246, 10860249, 10860260, 10860336, 10860346,
|
||||
10870246, 10870249, 10870260, 10870336, 10870346, 10870365,
|
||||
10880244, 10880245, 10880246, 10880249, 10880277, 10880309,
|
||||
10890244, 10890245, 10890246, 10890249, 10890260, 10890277,
|
||||
10900246, 10900247, 10900248, 10900249, 10900260, 10900366,
|
||||
10910154, 10910302, 10920154, 10920302, 10930241, 10930252,
|
||||
10930302, 10940241, 10940252, 10940302, 10950188, 10950210,
|
||||
10960216, 10960217, 10960258, 10960259, 10960281, 10970223,
|
||||
10970224, 10980223, 10980224, 10980226, 10980254, 10980276,
|
||||
10990223, 10990224, 10990254, 10990276, 10990291, 10990292,
|
||||
11000226, 11000229, 11000230, 11000254, 11000276, 11000292,
|
||||
11010224, 11010276, 11020119, 11020120, 11020121, 11020125,
|
||||
11020221, 11020251, 11020317, 11020342, 11080264, 11080265,
|
||||
11090264, 11120264, 11130264, 11130265, 11140264, 11140265,
|
||||
11150264, 11160264, 11160265, 11170264, 11170265, 11180264,
|
||||
11190264, 11200264, 11210264, 11210265, 11220264, 11220265,
|
||||
11230264, 11240264, 11250264, 11260264, 11280264, 11290264,
|
||||
11300264, 11310264, 11320264, 11330264, 11340264, 11350264,
|
||||
11360264, 11370264, 11390264, 11400264, 11410264, 11420264,
|
||||
11430264, 11440264, 11450264);
|
||||
|
||||
var
|
||||
hash: TX2IIHash;
|
||||
valueIndex: Integer;
|
||||
|
||||
begin
|
||||
{ Bug found in an import application when a bucket overflows }
|
||||
hash := TX2IIHash.Create;
|
||||
try
|
||||
for valueIndex := Low(TestValues) to High(TestValues) do
|
||||
hash[TestValues[valueIndex]] := valueIndex;
|
||||
|
||||
for valueIndex := Low(TestValues) to High(TestValues) do
|
||||
CheckEquals(hash[TestValues[valueIndex]], valueIndex, 'Index: ' + IntToStr(valueIndex));
|
||||
finally
|
||||
FreeAndNil(hash);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
initialization
|
||||
RegisterTest('Hashes', THashesSITest.Suite);
|
||||
RegisterTest('Hashes', THashesPOTest.Suite);
|
||||
RegisterTest('Hashes', THashesVariantTest.Suite);
|
||||
RegisterTest('Hashes', THashesBugTest.Suite);
|
||||
|
||||
end.
|
||||
|
94
UnitTests/X2UtUnitTests.dproj
Normal file
94
UnitTests/X2UtUnitTests.dproj
Normal file
@ -0,0 +1,94 @@
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{8bee0e67-704c-4611-9014-0f8cc2fb0289}</ProjectGuid>
|
||||
<MainSource>X2UtUnitTests.dpr</MainSource>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<DCC_DCCCompiler>DCC32</DCC_DCCCompiler>
|
||||
<DCC_DependencyCheckOutputName>X2UtUnitTests.exe</DCC_DependencyCheckOutputName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<Version>7.0</Version>
|
||||
<DCC_DebugInformation>False</DCC_DebugInformation>
|
||||
<DCC_WriteableConstants>True</DCC_WriteableConstants>
|
||||
<DCC_LocalDebugSymbols>False</DCC_LocalDebugSymbols>
|
||||
<DCC_GenerateStackFrames>True</DCC_GenerateStackFrames>
|
||||
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
|
||||
<DCC_DebugInfoInExe>True</DCC_DebugInfoInExe>
|
||||
<DCC_DebugVN>True</DCC_DebugVN>
|
||||
<DCC_UnitSearchPath>..\</DCC_UnitSearchPath>
|
||||
<DCC_ResourcePath>..\</DCC_ResourcePath>
|
||||
<DCC_ObjPath>..\</DCC_ObjPath>
|
||||
<DCC_IncludePath>..\</DCC_IncludePath>
|
||||
<DCC_Define>RELEASE</DCC_Define>
|
||||
<DCC_SYMBOL_PLATFORM>False</DCC_SYMBOL_PLATFORM>
|
||||
<DCC_UNIT_PLATFORM>False</DCC_UNIT_PLATFORM>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<Version>7.0</Version>
|
||||
<DCC_WriteableConstants>True</DCC_WriteableConstants>
|
||||
<DCC_GenerateStackFrames>True</DCC_GenerateStackFrames>
|
||||
<DCC_DebugInfoInExe>True</DCC_DebugInfoInExe>
|
||||
<DCC_DebugVN>True</DCC_DebugVN>
|
||||
<DCC_UnitSearchPath>..\</DCC_UnitSearchPath>
|
||||
<DCC_ResourcePath>..\</DCC_ResourcePath>
|
||||
<DCC_ObjPath>..\</DCC_ObjPath>
|
||||
<DCC_IncludePath>..\</DCC_IncludePath>
|
||||
<DCC_Define>DEBUG</DCC_Define>
|
||||
<DCC_SYMBOL_PLATFORM>False</DCC_SYMBOL_PLATFORM>
|
||||
<DCC_UNIT_PLATFORM>False</DCC_UNIT_PLATFORM>
|
||||
</PropertyGroup>
|
||||
<ProjectExtensions>
|
||||
<Borland.Personality>Delphi.Personality</Borland.Personality>
|
||||
<Borland.ProjectType>VCLApplication</Borland.ProjectType>
|
||||
<BorlandProject>
|
||||
<BorlandProject xmlns=""> <Delphi.Personality> <Parameters>
|
||||
<Parameters Name="RunParams">ip-to-country.csv countries.csv geo.db</Parameters>
|
||||
<Parameters Name="UseLauncher">False</Parameters>
|
||||
<Parameters Name="LoadAllSymbols">True</Parameters>
|
||||
<Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
|
||||
</Parameters>
|
||||
<VersionInfo>
|
||||
<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
|
||||
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
|
||||
<VersionInfo Name="MajorVer">1</VersionInfo>
|
||||
<VersionInfo Name="MinorVer">0</VersionInfo>
|
||||
<VersionInfo Name="Release">0</VersionInfo>
|
||||
<VersionInfo Name="Build">0</VersionInfo>
|
||||
<VersionInfo Name="Debug">False</VersionInfo>
|
||||
<VersionInfo Name="PreRelease">False</VersionInfo>
|
||||
<VersionInfo Name="Special">False</VersionInfo>
|
||||
<VersionInfo Name="Private">False</VersionInfo>
|
||||
<VersionInfo Name="DLL">False</VersionInfo>
|
||||
<VersionInfo Name="Locale">1043</VersionInfo>
|
||||
<VersionInfo Name="CodePage">1252</VersionInfo>
|
||||
</VersionInfo>
|
||||
<VersionInfoKeys>
|
||||
<VersionInfoKeys Name="CompanyName"></VersionInfoKeys>
|
||||
<VersionInfoKeys Name="FileDescription"></VersionInfoKeys>
|
||||
<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="InternalName"></VersionInfoKeys>
|
||||
<VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys>
|
||||
<VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys>
|
||||
<VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys>
|
||||
<VersionInfoKeys Name="ProductName"></VersionInfoKeys>
|
||||
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="Comments"></VersionInfoKeys>
|
||||
</VersionInfoKeys>
|
||||
<Source>
|
||||
<Source Name="MainSource">X2UtUnitTests.dpr</Source>
|
||||
</Source>
|
||||
</Delphi.Personality> </BorlandProject></BorlandProject>
|
||||
</ProjectExtensions>
|
||||
<ItemGroup />
|
||||
<ItemGroup>
|
||||
<DelphiCompile Include="X2UtUnitTests.dpr">
|
||||
<MainSource>MainSource</MainSource>
|
||||
</DelphiCompile>
|
||||
<DCCReference Include="..\X2UtSingleInstance.pas" />
|
||||
<DCCReference Include="Units\BitsTest.pas" />
|
||||
<DCCReference Include="Units\HashesTest.pas" />
|
||||
<DCCReference Include="Units\PersistTest.pas" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Borland.Delphi.Targets" />
|
||||
</Project>
|
@ -1123,7 +1123,7 @@ begin
|
||||
pNext := pValue^.Next;
|
||||
pValue^.Next := nil;
|
||||
|
||||
InternalFind(pBucket, ROR(Hash(pKey, iKey), pBucket^.Level * 8),
|
||||
InternalFind(pBucket, ROR(Hash(@pKey, iKey), pBucket^.Level * 8),
|
||||
pKey, iKey, True, pValue);
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user