[fpc-pascal] LZMA Algorithm fails on 64bit

Matthias Klumpp matthias at nlinux.org
Fri Jan 22 19:38:16 CET 2010


Hello!
I use the LZMA-SDK for Pascal to compress files. (
http://www.birtles.org.uk/programming/ )
I can compress files on 64bit and 32bit architecture. But if I try to
decompress LZMA-Compressed files on AMD64, it fails.
I use code [-1-] to decompress files. The action works perfectly on i386,
but if I compile it for AMD64 usi9ng FPC 2.4.0 it fails throwing the
exception 'Error in data stream'. It fails at code [-2-] in
TLZMADecoder.Code because pos0 is greater than nowPos64.
I'am trying now for about half a week to solve this problem, but I don't
have any idea now, why this happens on AMD64. The code does not use any
pointers which could be wrong, but maybe a type conversion from Int64 to
Int32...
Does anyone know why the code fails to work? Is this a bug in FPC?
Kind regards
   Matthias Klumpp


###################################################
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CodeSequence [-1-]:
-----

var inStream:TBufferedFS;
    outStream:TBufferedFS;
    decoder: TLZMADecoder;
    properties:array[0..4] of byte;
    filesize,outSize:Int64;
    i: Integer;
    v: byte;
const propertiessize=5;
begin
 if not FileExists(ipkfile) then Exception.Create('IPK file does not
exists!');

 try
  inStream:=TBufferedFS.Create(ipkfile, fmOpenRead or fmShareDenyNone);
 try
  outStream:=TBufferedFS.Create(workdir+'ipktar.tar', fmCreate);

  decoder:=TLZMADecoder.Create;
  inStream.position:=0;
    with decoder do
    begin
      if inStream.read(properties, propertiesSize) <> propertiesSize then
       raise Exception.Create('input .lzma file is too short');
      if not SetDecoderProperties(properties) then
       raise Exception.Create('Incorrect stream properties');

      outSize := 0;
      for i := 0 to 7 do
      begin
       v := inStream.ReadByte;
       if v < 0 then
        raise Exception.Create('Can''t read stream size');
       outSize := outSize or v shl (8 * i);
      end;
      if not Code(inStream, outStream, outSize) then
       raise Exception.Create('Error in data stream');
     end;
     decoder.Free;

 finally
  outStream.Free;
 end;
 finally
  inStream.Free;
 end;
end;

###################################################
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CodeSequence [-2-]:
-----

if (rep0 >= nowPos64) or (rep0 >= m_DictionarySizeCheck) then
      begin
         m_OutWindow.Flush();
         result:=false;
         exit;
      end;

###################################################



More information about the fpc-pascal mailing list