1
2
3
4
5
6
7
8
9
|
/*
* Copyright (c) 2008-2023 Jonathan Schleifer <js@nil.im>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
|
|
|
1
2
3
4
5
6
7
8
9
|
/*
* Copyright (c) 2008-2024 Jonathan Schleifer <js@nil.im>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
|
︙ | | | ︙ | |
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
if (_stream == nil)
@throw [OFNotOpenException exceptionWithObject: self];
for (;;) {
uint8_t byte;
uint32_t CRC32, uncompressedSize;
if (_stream.atEndOfStream) {
if (_state != OFGZIPStreamStateID1)
@throw [OFTruncatedDataException exception];
return 0;
}
switch (_state) {
|
>
>
>
>
>
>
|
|
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
if (_stream == nil)
@throw [OFNotOpenException exceptionWithObject: self];
for (;;) {
uint8_t byte;
uint32_t CRC32, uncompressedSize;
/*
* The inflate stream might have overread, causing _stream to
* be at the end, but the inflate stream will unread it once it
* has reached the end. Hence only check it if the state is not
* OFGZIPStreamStateData.
*/
if (_state != OFGZIPStreamStateData && _stream.atEndOfStream) {
if (_state != OFGZIPStreamStateID1)
@throw [OFTruncatedDataException exception];
return 0;
}
switch (_state) {
|
︙ | | | ︙ | |
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
|
[_inflateStream release];
_inflateStream = nil;
_state++;
break;
case OFGZIPStreamStateCRC32:
_bytesRead += [_stream readIntoBuffer: _buffer
length: 4 - _bytesRead];
if (_bytesRead < 4)
return 0;
CRC32 = ((uint32_t)_buffer[3] << 24) |
(_buffer[2] << 16) | (_buffer[1] << 8) | _buffer[0];
if (~_CRC32 != CRC32) {
|
|
>
|
|
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
|
[_inflateStream release];
_inflateStream = nil;
_state++;
break;
case OFGZIPStreamStateCRC32:
_bytesRead += [_stream
readIntoBuffer: _buffer + _bytesRead
length: 4 - _bytesRead];
if (_bytesRead < 4)
return 0;
CRC32 = ((uint32_t)_buffer[3] << 24) |
(_buffer[2] << 16) | (_buffer[1] << 8) | _buffer[0];
if (~_CRC32 != CRC32) {
|
︙ | | | ︙ | |
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
|
}
_bytesRead = 0;
_CRC32 = ~0;
_state++;
break;
case OFGZIPStreamStateUncompressedSize:
_bytesRead += [_stream readIntoBuffer: _buffer
length: 4 - _bytesRead];
uncompressedSize = ((uint32_t)_buffer[3] << 24) |
(_buffer[2] << 16) | (_buffer[1] << 8) | _buffer[0];
if (_uncompressedSize != uncompressedSize) {
OFString *actual = [OFString stringWithFormat:
@"%" PRIu32, _uncompressedSize];
OFString *expected = [OFString stringWithFormat:
@"%" PRIu32, uncompressedSize];
|
|
>
|
>
>
>
|
|
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
|
}
_bytesRead = 0;
_CRC32 = ~0;
_state++;
break;
case OFGZIPStreamStateUncompressedSize:
_bytesRead += [_stream
readIntoBuffer: _buffer + _bytesRead
length: 4 - _bytesRead];
if (_bytesRead < 4)
return 0;
uncompressedSize = (_buffer[3] << 24) |
(_buffer[2] << 16) | (_buffer[1] << 8) | _buffer[0];
if (_uncompressedSize != uncompressedSize) {
OFString *actual = [OFString stringWithFormat:
@"%" PRIu32, _uncompressedSize];
OFString *expected = [OFString stringWithFormat:
@"%" PRIu32, uncompressedSize];
|
︙ | | | ︙ | |
299
300
301
302
303
304
305
306
307
308
309
310
311
312
|
}
- (bool)lowlevelIsAtEndOfStream
{
if (_stream == nil)
@throw [OFNotOpenException exceptionWithObject: self];
return _stream.atEndOfStream;
}
- (bool)hasDataInReadBuffer
{
if (_state == OFGZIPStreamStateData)
return (super.hasDataInReadBuffer ||
|
>
>
>
>
>
>
>
>
|
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
|
}
- (bool)lowlevelIsAtEndOfStream
{
if (_stream == nil)
@throw [OFNotOpenException exceptionWithObject: self];
/*
* The inflate stream might have overread, causing _stream to be at the
* end, but the inflate stream will unread it once it has reached the
* end.
*/
if (_state == OFGZIPStreamStateData && !_inflateStream.atEndOfStream)
return false;
return _stream.atEndOfStream;
}
- (bool)hasDataInReadBuffer
{
if (_state == OFGZIPStreamStateData)
return (super.hasDataInReadBuffer ||
|
︙ | | | ︙ | |