On Mon, 2 Mar 2009, Juergen Keil wrote:

> lofiadm/main.c line 157:
>
> The local variable compres2p in function gzip_compress() / lofiadm/main.c
> should remain a static variable, so that openlib() and dlsym() is used
> exactly once.
>
>
> lofiadm/main.c line 184, 185:
>
> The '*' for the void * return type of SzAlloc function should be moved
> up one line
> (I think the idea is that a grep for "^SzAlloc" should find the
> function's definition):

Ah, I see. I'll change now that I know what is the
intent behind this change.

> static void *
> SzAlloc(..)
>
> Same in lofi.c, lines 199, 200
>
>
>>> usr/src/cmd/lofiadm/main.c lines 227 .. 231
>>>
>>> Why is the space available in the destination buffer for compressed data
>>> added to the compressed output?  The information seems to be unused.
>>> And this seems to waste 8 bytes for every compressed segment.  When
>>> cleaning this, all defines for LZMA_SIZE_OFFSET should be removed from
>>> lofiadm.c, lofi.c; and LZMA_HEADER_SIZE == LZMA_PROPS_SIZE.
>>
>> This is picked directly from the LZMA SDK. The LZMA
>> properties get stored in the first 8 bytes of every
>> compressed segment.
>
> 8 bytes?  LZMA_PROPS_SIZE is defined as 5:
>
> % grep LZMA_PROPS_SIZE usr/src/common/lzma/*.h
> usr/src/common/lzma/LzmaDec.h:#define LZMA_PROPS_SIZE 5
> usr/src/common/lzma/LzmaEnc.h:#define LZMA_PROPS_SIZE 5

That should have been 5 bytes for the properties followed
by 8 bytes of uncompressed segment size.

Here is how the LZMA header looks like (from LZMA SDK 4.62) -

LZMA compressed file format
---------------------------
Offset Size Description
   0     1   Special LZMA properties (lc,lp, pb in encoded form)
   1     4   Dictionary size (little endian)
   5     8   Uncompressed size (little endian). -1 means unknown size
  13         Compressed data

>> (though admittedly it seems a little
>> odd for LzmaEncode to take a pointer to the compressed
>> data and not the start of the header)
>>
>> I've gotten rid of LZMA_SIZE_OFFSET.
>
> The LZMA properties are a 5 bytes header, followed by an 8 byte
> compressed buffer length, followed by the lzma compressed data.
>
> The 8 byte compressed buffer length between the lzma properties
> and the lzma compressed data confuses me.  It was inserted by this
> piece of code it lofiadm/main.c:
>
>       dstp = (Byte *)dst;
>       t = *dstlen;
>       for (i = 0; i < 8; i++, t >>= 8) {
>               dstp[LZMA_SIZE_OFFSET + i] = (Byte)t;
>       }
>
> Is this length (*dstlen) needed?   I don't think we need this 8-byte
> length field;  the lzma compressed data should immediately
> follow the 5 byte lzma props data.

I believe that the uncompressed size is used by LZMA during
decompression.

> Ok, changing this now would make new lzma compressed
> files incompatible with the lzma compressed files that you
> can find on opensolaris global ISOs.  We would be changing
> the lzma compressed lofi data format.
>
> Btw. the 8-byte length field in the solaris.zlib image on
> osol-0906-108-global-x86.iso are wrong; I would expect
> to see the value 0x000000000001ffff, but I do find the value
> 0x0001ffff0001ffff ??  Since nobody is using this data,
> it doesn't matter...

That's odd, I'm going to pick apart that iso and let you
know what I see.

Alok

Reply via email to