@@ -81,11 +81,11 @@ OF_DIRECT_MEMBERS @interface OFZIPArchiveFileReadStream: OFStream { OFStream *_stream, *_decompressedStream; OFZIPArchiveEntry *_entry; - uint64_t _toRead; + unsigned long long _toRead; uint32_t _CRC32; bool _atEndOfStream; } - (instancetype)of_initWithStream: (OFStream *)stream @@ -96,11 +96,11 @@ @interface OFZIPArchiveFileWriteStream: OFStream { OFStream *_stream; uint32_t _CRC32; @public - int64_t _bytesWritten; + unsigned long long _bytesWritten; OFMutableZIPArchiveEntry *_entry; } - (instancetype)initWithStream: (OFStream *)stream entry: (OFMutableZIPArchiveEntry *)entry; @@ -408,11 +408,11 @@ [_lastReturnedStream isKindOfClass: [OFZIPArchiveFileWriteStream class]]) { OFZIPArchiveFileWriteStream *stream = (OFZIPArchiveFileWriteStream *)_lastReturnedStream; - if (INT64_MAX - _offset < stream->_bytesWritten) + if (ULLONG_MAX - _offset < stream->_bytesWritten) @throw [OFOutOfRangeException exception]; _offset += stream->_bytesWritten; if (stream->_entry != nil) { @@ -801,11 +801,11 @@ #if SIZE_MAX >= UINT64_MAX if (length > UINT64_MAX) @throw [OFOutOfRangeException exception]; #endif - if ((uint64_t)length > _toRead) + if (length > _toRead) length = (size_t)_toRead; ret = [_decompressedStream readIntoBuffer: buffer length: length]; _toRead -= ret; @@ -884,28 +884,28 @@ #if SIZE_MAX >= INT64_MAX if (length > INT64_MAX) @throw [OFOutOfRangeException exception]; #endif - if (INT64_MAX - _bytesWritten < (int64_t)length) + if (ULLONG_MAX - _bytesWritten < length) @throw [OFOutOfRangeException exception]; @try { [_stream writeBuffer: buffer length: length]; } @catch (OFWriteFailedException *e) { OFEnsure(e.bytesWritten <= length); - _bytesWritten += (int64_t)e.bytesWritten; + _bytesWritten += e.bytesWritten; _CRC32 = OFCRC32(_CRC32, buffer, e.bytesWritten); if (e.errNo == EWOULDBLOCK || e.errNo == EAGAIN) return e.bytesWritten; @throw e; } - _bytesWritten += (int64_t)length; + _bytesWritten += length; _CRC32 = OFCRC32(_CRC32, buffer, length); return length; } @@ -912,14 +912,17 @@ - (void)close { if (_stream == nil) @throw [OFNotOpenException exceptionWithObject: self]; + if (_bytesWritten > UINT64_MAX) + @throw [OFOutOfRangeException exception]; + [_stream writeLittleEndianInt32: 0x08074B50]; [_stream writeLittleEndianInt32: _CRC32]; - [_stream writeLittleEndianInt64: _bytesWritten]; - [_stream writeLittleEndianInt64: _bytesWritten]; + [_stream writeLittleEndianInt64: (uint64_t)_bytesWritten]; + [_stream writeLittleEndianInt64: (uint64_t)_bytesWritten]; [_stream release]; _stream = nil; _entry.CRC32 = ~_CRC32;