From 4788c38f2cbfdd16af134192a62442dbdb01d8f1 Mon Sep 17 00:00:00 2001 From: andrew <andrew@idefix.freepascal.org> Date: Thu, 8 Mar 2012 16:04:56 +0000 Subject: [PATCH] Fixed bug where generating a search for a chm with millions of words would use 4GB of memory! git-svn-id: trunk@20479 - --- packages/chm/src/chmfiftimain.pas | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/chm/src/chmfiftimain.pas b/packages/chm/src/chmfiftimain.pas index 78d37092bb..9e7b2bff18 100644 --- a/packages/chm/src/chmfiftimain.pas +++ b/packages/chm/src/chmfiftimain.pas @@ -287,7 +287,7 @@ begin // write the glorious header FHeaderRec.Sig[2] := $28; FHeaderRec.HTMLFilesCount := FWordList.IndexedFileCount; - FHeaderRec.RootNodeOffset := FStream.Size-4096; + FHeaderRec.RootNodeOffset := FStream.Size-FIFTI_NODE_SIZE; FHeaderRec.LeafNodeCount := TLeafNode(FActiveLeafNode).LeafNodeCount; FHeaderRec.CopyOfRootNodeOffset := FHeaderRec.RootNodeOffset; FHeaderRec.TreeDepth := 0; @@ -305,7 +305,7 @@ begin //FHeaderRec.CodeCountRootSize := 15; //FHeaderRec.LocationCodeRootSize := 15; - FHeaderRec.NodeSize := 4096; + FHeaderRec.NodeSize := FIFTI_NODE_SIZE; FHeaderRec.LongestWordLength := FWordList.LongestWord; FHeaderRec.TotalWordsIndexed := FWordList.TotalWordCount; FHeaderRec.TotalWords := FWordList.TotalDIfferentWords; @@ -549,6 +549,8 @@ begin WLCSize := WriteWLCEntries(AWord, FDocRootSize, FCodeRootSize, FLocRootSize); WriteCompressedIntegerBE(FBlockStream, WLCSize); + if FBlockStream.Position > FIFTI_NODE_SIZE then + raise Exception.Create('FIFTIMAIN Leaf node has written past the block!'); end; function Min(AValue, BValue: Byte): Byte; @@ -692,6 +694,8 @@ begin FBlockStream.Write(AWord[1], Length(AWord)); FBlockStream.WriteDWord(NtoLE(ANodeOffset)); FBlockStream.WriteWord(0); + if FBlockStream.Position > FIFTI_NODE_SIZE then + raise Exception.Create('FIFTIMAIN Index node has written past the block!'); end; procedure TIndexNode.Flush ( NewBlockNeeded: Boolean ) ; @@ -718,6 +722,7 @@ begin FBlockStream.Position := 0; FWriteStream.CopyFrom(FBlockStream, FIFTI_NODE_SIZE); + FBlockStream.Position := 0; FLastWord := '';