Index: src/OFZIPArchive.m ================================================================== --- src/OFZIPArchive.m +++ src/OFZIPArchive.m @@ -152,38 +152,29 @@ @implementation OFZIPArchive @synthesize delegate = _delegate, archiveComment = _archiveComment; static void -seekOrThrowInvalidFormat(OFZIPArchive *archive, const uint32_t *diskNumberPtr, +seekOrThrowInvalidFormat(OFZIPArchive *archive, const uint32_t *diskNumber, OFStreamOffset offset, OFSeekWhence whence) { - uint32_t diskNumber = 1; - - if (diskNumberPtr != NULL) { - diskNumber = *diskNumberPtr; - - if (diskNumber == 0) - diskNumber = 1; - } - - if (diskNumberPtr != NULL && diskNumber != archive->_diskNumber) { + if (diskNumber != NULL && *diskNumber != archive->_diskNumber) { OFStream *oldStream = archive->_stream; OFSeekableStream *stream; if (archive->_mode != modeRead || - diskNumber > archive->_lastDiskNumber) + *diskNumber > archive->_lastDiskNumber) @throw [OFInvalidFormatException exception]; stream = [archive->_delegate archive: archive - wantsPartNumbered: diskNumber + wantsPartNumbered: *diskNumber lastPartNumber: archive->_lastDiskNumber]; if (stream == nil) @throw [OFInvalidFormatException exception]; - archive->_diskNumber = diskNumber; + archive->_diskNumber = *diskNumber; archive->_stream = [stream retain]; [oldStream release]; } @try { @@ -238,14 +229,10 @@ if (![stream isKindOfClass: [OFSeekableStream class]]) @throw [OFInvalidArgumentException exception]; [self of_readZIPInfo]; [self of_readEntries]; - } else if (_mode == modeWrite) { - _diskNumber = 1; - _lastDiskNumber = 1; - _centralDirectoryDisk = 1; } if (_mode == modeAppend) { _offset = _centralDirectoryOffset; seekOrThrowInvalidFormat(self, NULL, @@ -320,13 +307,10 @@ if (!valid) @throw [OFInvalidFormatException exception]; _diskNumber = _lastDiskNumber = [_stream readLittleEndianInt16]; - if (_diskNumber == 0) - _diskNumber = _lastDiskNumber = 1; - _centralDirectoryDisk = [_stream readLittleEndianInt16]; _centralDirectoryEntriesInDisk = [_stream readLittleEndianInt16]; _centralDirectoryEntries = [_stream readLittleEndianInt16]; _centralDirectorySize = [_stream readLittleEndianInt32]; _centralDirectoryOffset = [_stream readLittleEndianInt32]; @@ -359,13 +343,10 @@ */ diskNumber = [_stream readLittleEndianInt32]; offset64 = [_stream readLittleEndianInt64]; _diskNumber = _lastDiskNumber = [_stream readLittleEndianInt32]; - if (_lastDiskNumber == 0) - @throw [OFInvalidFormatException exception]; - if (offset64 < 0 || (OFStreamOffset)offset64 != offset64) @throw [OFOutOfRangeException exception]; seekOrThrowInvalidFormat(self, &diskNumber, (OFStreamOffset)offset64, OFSeekSet); @@ -381,12 +362,10 @@ [_stream readLittleEndianInt16]; /* version needed to extract */ [_stream readLittleEndianInt16]; diskNumber = [_stream readLittleEndianInt32]; - if (diskNumber == 0) - diskNumber = 1; if (diskNumber != _diskNumber) @throw [OFInvalidFormatException exception]; _centralDirectoryDisk = [_stream readLittleEndianInt32]; _centralDirectoryEntriesInDisk =