@@ -1295,13 +1295,10 @@ GzipReader__new__(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1295
1295
args , kwargs , format , keywords , & fp , & buffer_size )) {
1296
1296
return NULL ;
1297
1297
}
1298
- if (buffer_size < 16 ) {
1299
- // Necessary to distinguish between truncated headers and headers
1300
- // which are too big. A header is at least 10 bytes, but may contain
1301
- // more depending on flags.
1298
+ if (buffer_size < 1 ) {
1302
1299
PyErr_Format (
1303
1300
PyExc_ValueError ,
1304
- "buffersize must be at least 16 , got %zd" , buffer_size
1301
+ "buffersize must be at least 1 , got %zd" , buffer_size
1305
1302
);
1306
1303
return NULL ;
1307
1304
}
@@ -1336,25 +1333,29 @@ GzipReader__new__(PyTypeObject *type, PyObject *args, PyObject *kwargs)
1336
1333
1337
1334
static inline ssize_t GzipReader_read_from_file (GzipReader * self )
1338
1335
{
1339
- uint8_t * input_buffer = self -> input_buffer ;
1336
+
1340
1337
uint8_t * current_pos = self -> current_pos ;
1341
1338
uint8_t * buffer_end = self -> buffer_end ;
1342
1339
size_t remaining = buffer_end - current_pos ;
1343
- if (remaining > 0 ) {
1344
- memmove (input_buffer , current_pos , remaining );
1340
+ if (remaining == self -> buffer_size ) {
1341
+ /* Buffer is full but a new read request was issued. This will be due
1342
+ to the header being bigger than the header. Enlarge the buffer
1343
+ to accommodate the hzip header. */
1344
+ size_t new_buffer_size = self -> buffer_size * 2 ;
1345
+ uint8_t * tmp_buffer = PyMem_Realloc (self -> input_buffer , new_buffer_size );
1346
+ if (tmp_buffer == NULL ) {
1347
+ PyErr_NoMemory ();
1348
+ return -1 ;
1349
+ }
1350
+ self -> input_buffer = tmp_buffer ;
1351
+ self -> buffer_size = new_buffer_size ;
1352
+ } else if (remaining > 0 ) {
1353
+ memmove (self -> input_buffer , current_pos , remaining );
1345
1354
}
1355
+ uint8_t * input_buffer = self -> input_buffer ;
1346
1356
current_pos = input_buffer ;
1347
1357
buffer_end = input_buffer + remaining ;
1348
1358
size_t read_in_size = self -> buffer_size - remaining ;
1349
- if (read_in_size == 0 ) {
1350
- // The buffer is already full of data but the current position could not
1351
- // progress. This happens when the header is too large.
1352
- PyErr_Format (
1353
- PyExc_OverflowError ,
1354
- "header does not fit into buffer of size %zu" ,
1355
- self -> buffer_size );
1356
- return -1 ;
1357
- }
1358
1359
PyObject * bufview = PyMemoryView_FromMemory (
1359
1360
(char * )buffer_end , read_in_size , MEMORYVIEW_READINTO_FLAGS );
1360
1361
if (bufview == NULL ) {
0 commit comments