private int ProcessExtraFieldZip64(byte[] buffer, int j, Int16 dataSize, long posn)
{
// The PKWare spec says that any of {UncompressedSize, CompressedSize,
// RelativeOffset} exceeding 0xFFFFFFFF can lead to the ZIP64 header,
// and the ZIP64 header may contain one or more of those. If the
// values are present, they will be found in the prescribed order.
// There may also be a 4-byte "disk start number."
// This means that the DataSize must be 28 bytes or less.
this._InputUsesZip64 = true;
// workitem 7941: check datasize before reading.
if (dataSize > 28)
throw new BadReadException(String.Format(" Inconsistent size (0x{0:X4}) for ZIP64 extra field at position 0x{1:X16}",
dataSize, posn));
int remainingData = dataSize;
var slurp = new Func<Int64>( () => {
if (remainingData < 8)
throw new BadReadException(String.Format(" Missing data for ZIP64 extra field, position 0x{0:X16}", posn));
var x = BitConverter.ToInt64(buffer, j);
j+= 8;
remainingData -= 8;
return x;
});
if (this._UncompressedSize == 0xFFFFFFFF)
this._UncompressedSize = slurp();
if (this._CompressedSize == 0xFFFFFFFF)
this._CompressedSize = slurp();
if (this._RelativeOffsetOfLocalHeader == 0xFFFFFFFF)
this._RelativeOffsetOfLocalHeader = slurp();
// Ignore anything else. Potentially there are 4 more bytes for the
// disk start number. DotNetZip currently doesn't handle multi-disk
// archives.
return j;
}