Skip to content

Commit 8dfdb2e

Browse files
committed
fix out of bounds access by improving decompression buffer allocation strategy, minor improvements, random capitalization changes
1 parent 1bc5d4d commit 8dfdb2e

File tree

11 files changed

+841
-119
lines changed

11 files changed

+841
-119
lines changed

dist/CombinePDF.xlsm

9.54 KB
Binary file not shown.

src/Dictionary.cls

Lines changed: 56 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ End Type
202202
#If x32 Then
203203
Private Type EnumerableVariant
204204
Value As Variant
205-
meta As Long
205+
Meta As Long
206206
IsItemObj As Boolean
207207
IsKeyObj As Boolean
208208
NextPtr As Long
@@ -358,7 +358,7 @@ Private Type DictionaryVariables
358358
Items() As Variant
359359
#If x64 Then
360360
Keys() As Variant
361-
meta() As Long
361+
Meta() As Long
362362
#Else
363363
Keys() As EnumerableVariant
364364
#End If
@@ -454,7 +454,7 @@ Attribute Item.VB_UserMemId = 0
454454
End If
455455
#End If
456456
#If x64 Then
457-
If Vars.meta(i) And isItemObjBit Then
457+
If Vars.Meta(i) And isItemObjBit Then
458458
#Else
459459
If Vars.Keys(i).IsItemObj Then
460460
#End If
@@ -476,7 +476,7 @@ Public Property Let Item(ByRef Key As Variant, ByRef Item As Variant)
476476
Exit Property
477477
End If
478478
#If x64 Then
479-
Vars.meta(i) = Vars.meta(i) And keyBitMask
479+
Vars.Meta(i) = Vars.Meta(i) And keyBitMask
480480
#Else
481481
Vars.Keys(i).IsItemObj = False
482482
#End If
@@ -492,7 +492,7 @@ Public Property Set Item(ByRef Key As Variant, ByRef Item As Object)
492492
Exit Property
493493
End If
494494
#If x64 Then
495-
Vars.meta(i) = Vars.meta(i) Or isItemObjBit
495+
Vars.Meta(i) = Vars.Meta(i) Or isItemObjBit
496496
#Else
497497
Vars.Keys(i).IsItemObj = True
498498
#End If
@@ -547,7 +547,7 @@ Private Sub Init(Optional ByVal newGroupCount As Long = initialGroupCount)
547547
ReDim .Items(0 To .UBound)
548548
#If x64 Then
549549
ReDim .Keys(0 To .UBound + 1) 'Extra member for safe IEnumVariant
550-
ReDim .meta(0 To .UBound)
550+
ReDim .Meta(0 To .UBound)
551551
#Else
552552
ReDim .Keys(0 To .UBound)
553553
#End If
@@ -597,7 +597,7 @@ Public Function Add(ByRef Key As Variant _
597597
End If
598598
#If x64 Then 'Extra member for safe IEnumVariant
599599
ReDim Preserve Vars.Keys(0 To Vars.UBound + 1)
600-
ReDim Preserve Vars.meta(0 To Vars.UBound)
600+
ReDim Preserve Vars.Meta(0 To Vars.UBound)
601601
#Else
602602
ReDim Preserve Vars.Keys(0 To Vars.UBound)
603603
#End If
@@ -644,10 +644,10 @@ Public Function Add(ByRef Key As Variant _
644644
End If
645645
End If
646646
If IsObject(Item) Then
647-
Vars.meta(i) = hVal Or isItemObjBit
647+
Vars.Meta(i) = hVal Or isItemObjBit
648648
Set Vars.Items(i) = Item
649649
Else
650-
Vars.meta(i) = hVal
650+
Vars.Meta(i) = hVal
651651
Vars.Items(i) = Item
652652
End If
653653
#Else
@@ -664,7 +664,7 @@ Public Function Add(ByRef Key As Variant _
664664
Else
665665
Vars.Items(i) = Item
666666
End If
667-
.meta = hVal
667+
.Meta = hVal
668668
End With
669669
#End If
670670
End Function
@@ -679,9 +679,9 @@ Private Sub Rehash(ByVal newGroupCount As Long)
679679
InitHashMap newGroupCount
680680
For i = 0 To Vars.Count - 1
681681
#If x64 Then
682-
hVal = Vars.meta(i)
682+
hVal = Vars.Meta(i)
683683
#Else
684-
hVal = Vars.Keys(i).meta
684+
hVal = Vars.Keys(i).Meta
685685
#End If
686686
If hVal <> hmRemoved Then
687687
groupSlot = hVal And Vars.Hash.GroupMask
@@ -898,7 +898,7 @@ Private Sub GetIndex(ByRef Key As Variant _
898898
End If
899899
outIndex = .Index(posInGroup)
900900
#If x64 Then
901-
If (Vars.meta(outIndex) And keyBitMask) = hVal Then
901+
If (Vars.Meta(outIndex) And keyBitMask) = hVal Then
902902
If vt = vbString And (Vars.Compare > vbBinaryCompare) Then
903903
If StrComp(Vars.Keys(outIndex) _
904904
, Key, Vars.Compare) = 0 Then Exit Sub
@@ -911,7 +911,7 @@ Private Sub GetIndex(ByRef Key As Variant _
911911
End If
912912
End If
913913
#Else
914-
If Vars.Keys(outIndex).meta = hVal Then
914+
If Vars.Keys(outIndex).Meta = hVal Then
915915
If vt = vbString And (Vars.Compare > vbBinaryCompare) Then
916916
If StrComp(Vars.Keys(outIndex).Value _
917917
, Key, Vars.Compare) = 0 Then Exit Sub
@@ -1012,9 +1012,9 @@ Private Function CountRemoved(ByVal upTo As Long) As Long
10121012
End If
10131013
For i = startIndex To endIndex
10141014
#If x64 Then
1015-
If Vars.meta(i) = hmRemoved Then CountRemoved = CountRemoved + 1
1015+
If Vars.Meta(i) = hmRemoved Then CountRemoved = CountRemoved + 1
10161016
#Else
1017-
If Vars.Keys(i).meta = hmRemoved Then CountRemoved = CountRemoved + 1
1017+
If Vars.Keys(i).Meta = hmRemoved Then CountRemoved = CountRemoved + 1
10181018
#End If
10191019
If CountRemoved = totalRemoved Then Exit For
10201020
Next i
@@ -1029,7 +1029,7 @@ Public Property Get ItemAtIndex(ByVal i As Long) As Variant
10291029
If Vars.UsedCount < Vars.Count Then i = FindIndex(i)
10301030
'
10311031
#If x64 Then
1032-
If Vars.meta(i) And isItemObjBit Then
1032+
If Vars.Meta(i) And isItemObjBit Then
10331033
#Else
10341034
If Vars.Keys(i).IsItemObj Then
10351035
#End If
@@ -1046,7 +1046,7 @@ Public Property Let ItemAtIndex(ByVal i As Long, ByRef Item As Variant)
10461046
'
10471047
If Vars.UsedCount < Vars.Count Then i = FindIndex(i)
10481048
#If x64 Then
1049-
Vars.meta(i) = Vars.meta(i) And keyBitMask
1049+
Vars.Meta(i) = Vars.Meta(i) And keyBitMask
10501050
#Else
10511051
Vars.Keys(i).IsItemObj = False
10521052
#End If
@@ -1057,7 +1057,7 @@ Public Property Set ItemAtIndex(ByVal i As Long, ByRef Item As Object)
10571057
If Vars.UsedCount < Vars.Count Then i = FindIndex(i)
10581058
'
10591059
#If x64 Then
1060-
Vars.meta(i) = Vars.meta(i) Or isItemObjBit
1060+
Vars.Meta(i) = Vars.Meta(i) Or isItemObjBit
10611061
#Else
10621062
Vars.Keys(i).IsItemObj = True
10631063
#End If
@@ -1067,9 +1067,9 @@ Private Function FindIndex(ByVal i As Long) As Long
10671067
Dim j As Long
10681068
For j = 0 To Vars.Count - 1
10691069
#If x64 Then
1070-
If Vars.meta(j) <> hmRemoved Then i = i - 1
1070+
If Vars.Meta(j) <> hmRemoved Then i = i - 1
10711071
#Else
1072-
If Vars.Keys(j).meta <> hmRemoved Then i = i - 1
1072+
If Vars.Keys(j).Meta <> hmRemoved Then i = i - 1
10731073
#End If
10741074
If i < 0 Then Exit For
10751075
Next j
@@ -1100,10 +1100,10 @@ Public Property Get Items() As Variant()
11001100
'
11011101
For i = 0 To Vars.Count - 1
11021102
#If x64 Then
1103-
If Vars.meta(i) <> hmRemoved Then
1104-
If Vars.meta(i) And isItemObjBit Then
1103+
If Vars.Meta(i) <> hmRemoved Then
1104+
If Vars.Meta(i) And isItemObjBit Then
11051105
#Else
1106-
If Vars.Keys(i).meta <> hmRemoved Then
1106+
If Vars.Keys(i).Meta <> hmRemoved Then
11071107
If Vars.Keys(i).IsItemObj Then
11081108
#End If
11091109
Set res(j) = Vars.Items(i)
@@ -1164,13 +1164,13 @@ Public Property Let Key(ByRef OldKey As Variant, ByRef NewKey As Variant)
11641164
Else
11651165
If isObj Then Set Vars.Keys(i) = NewKey Else Vars.Keys(i) = NewKey
11661166
End If
1167-
If Vars.meta(i) And isItemObjBit Then hVal = hVal Or isItemObjBit
1168-
Vars.meta(i) = hVal
1167+
If Vars.Meta(i) And isItemObjBit Then hVal = hVal Or isItemObjBit
1168+
Vars.Meta(i) = hVal
11691169
#Else
11701170
With Vars.Keys(i)
11711171
.IsKeyObj = CBool(hVal And HashMeta.hmObject)
11721172
If .IsKeyObj Then Set .Value = NewKey Else .Value = NewKey
1173-
.meta = hVal
1173+
.Meta = hVal
11741174
End With
11751175
#End If
11761176
'
@@ -1213,7 +1213,7 @@ Public Property Get KeyAtIndex(ByVal i As Long) As Variant
12131213
If Vars.UsedCount < Vars.Count Then i = FindIndex(i)
12141214
'
12151215
#If x64 Then
1216-
If Vars.meta(i) And hmObject Then
1216+
If Vars.Meta(i) And hmObject Then
12171217
Set KeyAtIndex = Vars.Keys(i)
12181218
Else
12191219
KeyAtIndex = Vars.Keys(i)
@@ -1252,8 +1252,8 @@ Public Property Get Keys() As Variant()
12521252
Else
12531253
ReDim res(0 To Vars.UsedCount - 1)
12541254
For i = 0 To Vars.Count - 1
1255-
If Vars.meta(i) <> hmRemoved Then
1256-
If Vars.meta(i) And hmObject Then
1255+
If Vars.Meta(i) <> hmRemoved Then
1256+
If Vars.Meta(i) And hmObject Then
12571257
Set res(j) = Vars.Keys(i)
12581258
Else
12591259
res(j) = Vars.Keys(i)
@@ -1267,7 +1267,7 @@ Public Property Get Keys() As Variant()
12671267
ReDim res(0 To Vars.UsedCount - 1)
12681268
For i = 0 To Vars.Count - 1
12691269
With Vars.Keys(i)
1270-
If .meta <> hmRemoved Then
1270+
If .Meta <> hmRemoved Then
12711271
If .IsKeyObj Then Set res(j) = .Value Else res(j) = .Value
12721272
j = j + 1
12731273
End If
@@ -1301,16 +1301,16 @@ Public Property Get KeysItems2D() As Variant()
13011301
ReDim res(0 To .UsedCount - 1, 0 To 1)
13021302
For i = 0 To .Count - 1
13031303
#If x64 Then
1304-
If .meta(i) <> hmRemoved Then
1305-
If .meta(i) And hmObject Then Set res(j, 0) = .Keys(i) _
1304+
If .Meta(i) <> hmRemoved Then
1305+
If .Meta(i) And hmObject Then Set res(j, 0) = .Keys(i) _
13061306
Else res(j, 0) = .Keys(i)
1307-
If .meta(i) And isItemObjBit Then Set res(j, 1) = .Items(i) _
1307+
If .Meta(i) And isItemObjBit Then Set res(j, 1) = .Items(i) _
13081308
Else res(j, 1) = .Items(i)
13091309
j = j + 1
13101310
End If
13111311
#Else
13121312
With .Keys(i)
1313-
If .meta <> hmRemoved Then
1313+
If .Meta <> hmRemoved Then
13141314
If .IsKeyObj Then Set res(j, 0) = .Value _
13151315
Else res(j, 0) = .Value
13161316
If .IsItemObj Then Set res(j, 1) = Vars.Items(i) _
@@ -1381,26 +1381,26 @@ Public Function Remove(ByRef Key As Variant _
13811381
Vars.Items(i) = Empty
13821382
#If x64 Then
13831383
Vars.Keys(i) = Empty
1384-
Vars.meta(i) = hmRemoved
1384+
Vars.Meta(i) = hmRemoved
13851385
#Else
13861386
Vars.Keys(i).Value = Empty
1387-
Vars.Keys(i).meta = hmRemoved
1387+
Vars.Keys(i).Meta = hmRemoved
13881388
#End If
13891389
If Vars.Enums.hasEnum Then 'Link previous to next
13901390
j = i + 1
13911391
#If x64 Then
1392-
Do While Vars.meta(j) = hmRemoved: j = j + 1: Loop
1392+
Do While Vars.Meta(j) = hmRemoved: j = j + 1: Loop
13931393
#Else
1394-
Do While Vars.Keys(j).meta = hmRemoved: j = j + 1: Loop
1394+
Do While Vars.Keys(j).Meta = hmRemoved: j = j + 1: Loop
13951395
#End If
13961396
ptr = VarPtr(Vars.Keys(j))
13971397
RemoveUnusedEnums VarPtr(Vars.Keys(i)), ptr
13981398
j = i - 1
13991399
Do While j >= 0
14001400
#If x64 Then
1401-
If Vars.meta(j) <> hmRemoved Then Exit Do
1401+
If Vars.Meta(j) <> hmRemoved Then Exit Do
14021402
#Else
1403-
If Vars.Keys(j).meta <> hmRemoved Then Exit Do
1403+
If Vars.Keys(j).Meta <> hmRemoved Then Exit Do
14041404
#End If
14051405
j = j - 1
14061406
Loop
@@ -1421,9 +1421,9 @@ Public Function Remove(ByRef Key As Variant _
14211421
If Vars.Count > Vars.UsedCount Then
14221422
i = lastPos - 1
14231423
#If x64 Then
1424-
Do While Vars.meta(i) = hmRemoved: i = i - 1: Loop
1424+
Do While Vars.Meta(i) = hmRemoved: i = i - 1: Loop
14251425
#Else
1426-
Do While Vars.Keys(i).meta = hmRemoved: i = i - 1: Loop
1426+
Do While Vars.Keys(i).Meta = hmRemoved: i = i - 1: Loop
14271427
#End If
14281428
Vars.Count = Vars.Count - lastPos + i + 1
14291429
End If
@@ -1644,7 +1644,7 @@ Friend Sub InitStructs(ByRef dict As Dictionary _
16441644
Const opNumDictHashVal As Long = 21
16451645
Const opNumCollItem As Long = 7
16461646
Static mainVTable(0 To dictMainVTableSize - 1) As LongPtr
1647-
Static c As Collection
1647+
Static C As Collection
16481648
Static saC As SAFEARRAY_1D
16491649
Dim i As Long
16501650
'
@@ -1653,7 +1653,7 @@ Friend Sub InitStructs(ByRef dict As Dictionary _
16531653
' calls to HashVal with early binding speed without a dll reference
16541654
'
16551655
InitSafeArray saC, ptrSize
1656-
saC.pvData = VarPtr(c)
1656+
saC.pvData = VarPtr(C)
16571657
saC.rgsabound0.cElements = 1
16581658
saPtrs(4) = VarPtr(saC)
16591659
'
@@ -1695,7 +1695,7 @@ Friend Sub InitStructs(ByRef dict As Dictionary _
16951695
h.sdl.hashModulo = HashMeta.[_modHM]
16961696
h.sdl.refCount = 2 'To avoid deallocation
16971697
h.saP.rgsabound0.cElements = 1
1698-
h.saP.pvData = VarPtr(c)
1698+
h.saP.pvData = VarPtr(C)
16991699
Mem.RPtr(0) = VarPtr(h.sdl)
17001700
End If
17011701
#If x64StackIssues Then
@@ -1829,9 +1829,9 @@ Private Property Let MemLongPtr(ByVal memAddress As LongPtr _
18291829
VariantCopy remoteVT, VarPtr(fv) 'Init VarType ByRef
18301830
'
18311831
#If Win64 Then 'Cannot assign LongLong ByRef
1832-
Dim c As Currency
1833-
RemoteAssign memValue, VarPtr(newValue), remoteVT, vbCurrency + VT_BYREF, c, memValue
1834-
RemoteAssign memValue, memAddress, remoteVT, vbCurrency + VT_BYREF, memValue, c
1832+
Dim C As Currency
1833+
RemoteAssign memValue, VarPtr(newValue), remoteVT, vbCurrency + VT_BYREF, C, memValue
1834+
RemoteAssign memValue, memAddress, remoteVT, vbCurrency + VT_BYREF, memValue, C
18351835
#Else 'Can assign Long ByRef
18361836
RemoteAssign memValue, memAddress, remoteVT, vbLong + VT_BYREF, memValue, newValue
18371837
#End If
@@ -2006,9 +2006,9 @@ Private Function DictEnum() As IUnknown
20062006
i = 0
20072007
If hasGaps Then
20082008
#If x64 Then
2009-
Do While Vars.meta(i) = hmRemoved: i = i + 1: Loop
2009+
Do While Vars.Meta(i) = hmRemoved: i = i + 1: Loop
20102010
#Else
2011-
Do While Vars.Keys(i).meta = hmRemoved: i = i + 1: Loop
2011+
Do While Vars.Keys(i).Meta = hmRemoved: i = i + 1: Loop
20122012
#End If
20132013
End If
20142014
With Mem.Common(0)
@@ -2033,7 +2033,7 @@ Private Function DictEnum() As IUnknown
20332033
If hasGaps Then
20342034
j = i * 3 + 5
20352035
For i = i + 1 To Vars.Count - 1
2036-
If Vars.meta(i) <> hmRemoved Then
2036+
If Vars.Meta(i) <> hmRemoved Then
20372037
Mem.RPtr(j) = ptr + variantSize * i
20382038
j = i * 3 + 5
20392039
End If
@@ -2059,7 +2059,7 @@ Private Function DictEnum() As IUnknown
20592059
If hasGaps Then
20602060
j = i
20612061
For i = i + 1 To Vars.Count - 1
2062-
If Vars.Keys(i).meta <> hmRemoved Then
2062+
If Vars.Keys(i).Meta <> hmRemoved Then
20632063
Vars.Keys(j).NextPtr = ptr + enumVarSize * i
20642064
j = i
20652065
End If
@@ -2239,8 +2239,8 @@ Friend Sub ManageDeepNested(ByRef v As DictionaryVariables _
22392239
Else
22402240
For i = 0 To v.Count - 1
22412241
#If x64 Then
2242-
If v.meta(i) And hmObject Then dicts.Add v.Keys(i)
2243-
If v.meta(i) And isItemObjBit Then dicts.Add v.Items(i)
2242+
If v.Meta(i) And hmObject Then dicts.Add v.Keys(i)
2243+
If v.Meta(i) And isItemObjBit Then dicts.Add v.Items(i)
22442244
#Else
22452245
If v.Keys(i).IsKeyObj Then dicts.Add v.Keys(i).Value
22462246
If v.Keys(i).IsItemObj Then dicts.Add v.Items(i)
@@ -2470,7 +2470,7 @@ Public Function TryGetItem(ByRef Key As Variant _
24702470
Dim i As Long: GetIndex Key, i, IgnoreErrors:=True
24712471
If i <= notFound Then Exit Function
24722472
#If x64 Then
2473-
If Vars.meta(i) And isItemObjBit Then
2473+
If Vars.Meta(i) And isItemObjBit Then
24742474
#Else
24752475
If Vars.Keys(i).IsItemObj Then
24762476
#End If

0 commit comments

Comments
 (0)