[delphizip] Re: Memory leak in Inflate.c in Unzip.dll

  • From: "Roger Aelbrecht" <Roger.Aelbrecht@xxxxxxxxxx>
  • To: <delphizip@xxxxxxxxxxxxx>
  • Date: Sat, 10 May 2003 21:11:56 +0200

James Turner wrote:
> Roger,
> 
> I don't have any reference code, but I have included the password
> checking code I use in Zipfusion.
> I arrived at this solution partially from code analysis and partially
> from experimentation using the debugger to watch variables.
> 
> James Turner
> SKARO.NET
> 
> 
> procedure EnterPassword(WND:HWND; Attempts:integer);
> { The file pointer is assumed to be located at the start }
> { of the file data or the 12-byte encryption prefix.     }
> { Failure will raise an exception.                       }
> type TCryptBlock = array [0..(SizeOf(TZipCryptKey) div 2) - 1] of
> Word; 
> 
>     function Decrypt(CryptBlock:TCryptBlock):Boolean;
>     { CryptBlock must be passed as a value parameter otherwise the }
>     { password has to be entered correctly at the first attempt.   }
>     const InitKey : TZipCryptKey = (305419896,591751049,878082192);
>     var   i       : integer;
>           w       : Word;
>     begin
>       Result   := False; if Password = '' then exit;
>       CryptKey := InitKey;
> 
>       for i := 1 to Length(Password) do
> UpdateCryptKey(byte(Password[i])); 
> 
>       DecryptBuff(@CryptBlock,SizeOf(CryptBlock));
>       w := CryptBlock[High(CryptBlock)];
> 
>       with Header do if Flags and 8 = 0 then result := w =
>                                         HiWord(CRC32) else result :=
>     w = LoWord(FileDate); end;
> 
> var CryptBlock : TCryptBlock;
> begin { EnterPassword }
>   if (Header.Flags and 1) = 0 then exit; { Not password protected }
> 
>   { If AutoRun is true, SkipFile should always be called }
>   if not AutoRun then begin
>     InfileRead(CryptBlock,SizeOf(CryptBlock));
> 
>     if Password <> '' then inc(Attempts);
> 
>     repeat
>       if Decrypt(CryptBlock) then Exit;
> 
>       if (Attempts > 0) then begin
>         dec(Attempts);
>         case
> DialogBoxParam(HInstance,'DIALOG_Password',WND,@DP_Password,0) of
>           ID_OK     : Continue;
>           ID_No     : Break; { Skip button : return false }
>           ID_Cancel : SkipFile('',sfAbort);
>         else end;
>       end
>       else Break;
> 
>     until false;
>   end;
> 
>   SkipFile(SourceFileName,sfWrongPassword);
> end;
> 
> 
> -----------
> To unsubscribe from this list, send an empty e-mail
> message to:
>   delphizip-request@xxxxxxxxxxxxx
> and put the word unsubscribe in the subject.

I got the impression that this is not the complete code

Missing -> DecryptBuff(@CryptBlock, SizeOf(CryptBlock);

I presume this is the replacement of decrypt_byte 
probably the most important part

Missing->UpdateCryptKey( byte(Password[i]));

Maybe I did look gooed enough ?


Roger Aelbrecht
http://web.wanadoo.be/driehoeksw
-----------
To unsubscribe from this list, send an empty e-mail 
message to:
  delphizip-request@xxxxxxxxxxxxx 
and put the word unsubscribe in the subject.

Other related posts: