From ca92dd416a2b2fb30c9259c45a902e673673e069 Mon Sep 17 00:00:00 2001 From: marco Date: Sat, 26 Aug 2006 15:45:04 +0000 Subject: [PATCH] * fix for 0007292, guard all for loops with unsigned loopcounter against overflow. git-svn-id: trunk@4507 - --- fcl/inc/contnrs.pp | 110 +++++++++++++++++++++++++-------------------- 1 file changed, 61 insertions(+), 49 deletions(-) diff --git a/fcl/inc/contnrs.pp b/fcl/inc/contnrs.pp index e07c6c96c1..3ff9bdcf0c 100644 --- a/fcl/inc/contnrs.pp +++ b/fcl/inc/contnrs.pp @@ -836,11 +836,12 @@ var begin a := 63689; Result := 0; - for i := 1 to Length(S) do - begin - Result := Result * a + Ord(S[i]); - a := a * b; - end; + if length(s)>0 then + for i := 1 to Length(S) do + begin + Result := Result * a + Ord(S[i]); + a := a * b; + end; Result := (Result and $7FFFFFFF) mod TableSize; end; @@ -928,8 +929,9 @@ procedure TFPHashTable.InitializeHashTable; var i: LongWord; begin - for i := 0 to FHashTableSize-1 do - FHashTable.Add(nil); + if FHashTableSize>0 Then + for i := 0 to FHashTableSize-1 do + FHashTable.Add(nil); FCount := 0; end; @@ -945,15 +947,16 @@ begin FHashTableSize := ANewSize; FHashTable := TFPObjectList.Create(True); InitializeHashTable; - for i := 0 to SavedTableSize-1 do - begin - if Assigned(SavedTable[i]) then - for j := 0 to TFPObjectList(SavedTable[i]).Count -1 do + If SavedTableSize>0 Then + for i := 0 to SavedTableSize-1 do begin - temp := THTNode(TFPObjectList(SavedTable[i])[j]); - Add(temp.Key, temp.Data); + if Assigned(SavedTable[i]) then + for j := 0 to TFPObjectList(SavedTable[i]).Count -1 do + begin + temp := THTNode(TFPObjectList(SavedTable[i])[j]); + Add(temp.Key, temp.Data); + end; end; - end; SavedTable.Free; end; @@ -975,12 +978,13 @@ begin chn := Chain(hashCode); if Assigned(chn) then begin - for i := 0 to chn.Count - 1 do - if THTNode(chn[i]).HasKey(aKey) then - begin - result := THTNode(chn[i]); - exit; - end; + if chn.count>0 then + for i := 0 to chn.Count - 1 do + if THTNode(chn[i]).HasKey(aKey) then + begin + result := THTNode(chn[i]); + exit; + end; end; Result := nil; end; @@ -1006,12 +1010,13 @@ begin chn := Chain(hashCode); if Assigned(chn) then begin - for i := 0 to chn.Count - 1 do - if THTNode(chn[i]).HasKey(aKey) then - begin - Result := THTNode(chn[i]); - exit; - end + if chn.count>0 then + for i := 0 to chn.Count - 1 do + if THTNode(chn[i]).HasKey(aKey) then + begin + Result := THTNode(chn[i]); + exit; + end end else begin @@ -1035,11 +1040,12 @@ procedure TFPHashTable.Clear; var i: Longword; begin - for i := 0 to FHashTableSize - 1 do - begin - if Assigned(Chain(i)) then - Chain(i).Clear; - end; + if FHashTableSize>0 Then + for i := 0 to FHashTableSize - 1 do + begin + if Assigned(Chain(i)) then + Chain(i).Clear; + end; FCount := 0; end; @@ -1050,21 +1056,23 @@ var begin Result := nil; continue := true; - for i := 0 to FHashTableSize-1 do - begin - if assigned(Chain(i)) then + if FHashTableSize>0 then + for i := 0 to FHashTableSize-1 do begin - for j := 0 to Chain(i).Count-1 do + if assigned(Chain(i)) then begin - aMethod(THTNode(Chain(i)[j]).Data, THTNode(Chain(i)[j]).Key, continue); - if not continue then + if chain(i).count>0 then + for j := 0 to Chain(i).Count-1 do begin - Result := THTNode(Chain(i)[j]); - Exit; + aMethod(THTNode(Chain(i)[j]).Data, THTNode(Chain(i)[j]).Key, continue); + if not continue then + begin + Result := THTNode(Chain(i)[j]); + Exit; + end; end; end; end; - end; end; procedure TFPHashTable.Add(const aKey: string; aItem: pointer); @@ -1078,9 +1086,10 @@ begin chn := Chain(hashCode); if Assigned(chn) then begin - for i := 0 to chn.Count - 1 do - if THTNode(chn[i]).HasKey(aKey) then - Raise EDuplicate.CreateFmt(DuplicateMsg, [aKey]); + if chn.count>0 then + for i := 0 to chn.Count - 1 do + if THTNode(chn[i]).HasKey(aKey) then + Raise EDuplicate.CreateFmt(DuplicateMsg, [aKey]); end else begin @@ -1103,6 +1112,7 @@ begin chn := Chain(hashCode); if Assigned(chn) then begin + if chn.count>0 then for i := 0 to chn.Count - 1 do if THTNode(chn[i]).HasKey(aKey) then begin @@ -1130,9 +1140,10 @@ var num: Longword; begin num := 0; - for i:= 0 to FHashTableSize-1 do - if Not Assigned(Chain(i)) then - inc(num); + if FHashTableSize>0 Then + for i:= 0 to FHashTableSize-1 do + if Not Assigned(Chain(i)) then + inc(num); result := num; end; @@ -1151,9 +1162,10 @@ var i: Longword; begin Result := 0; - for i := 0 to FHashTableSize-1 do - if ChainLength(i) > Result then - Result := ChainLength(i); + if FHashTableSize>0 Then + for i := 0 to FHashTableSize-1 do + if ChainLength(i) > Result then + Result := ChainLength(i); end; end.