Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
37d3ff14
Commit
37d3ff14
authored
Aug 05, 2012
by
Nadeem Vawda
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
#15546: Fix {GzipFile,LZMAFile}.read1()'s handling of pathological input data.
parent
9c92a691
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
35 additions
and
24 deletions
+35
-24
Lib/gzip.py
Lib/gzip.py
+4
-1
Lib/lzma.py
Lib/lzma.py
+28
-23
Misc/NEWS
Misc/NEWS
+3
-0
No files found.
Lib/gzip.py
View file @
37d3ff14
...
...
@@ -385,7 +385,10 @@ class GzipFile(io.BufferedIOBase):
return
b''
try
:
self
.
_read
()
# For certain input data, a single call to _read() may not return
# any data. In this case, retry until we get some data or reach EOF.
while
self
.
extrasize
<=
0
:
self
.
_read
()
except
EOFError
:
pass
if
size
<
0
or
size
>
self
.
extrasize
:
...
...
Lib/lzma.py
View file @
37d3ff14
...
...
@@ -204,29 +204,31 @@ class LZMAFile(io.BufferedIOBase):
# Fill the readahead buffer if it is empty. Returns False on EOF.
def
_fill_buffer
(
self
):
if
self
.
_buffer
:
return
True
if
self
.
_decompressor
.
unused_data
:
rawblock
=
self
.
_decompressor
.
unused_data
else
:
rawblock
=
self
.
_fp
.
read
(
_BUFFER_SIZE
)
if
not
rawblock
:
if
self
.
_decompressor
.
eof
:
self
.
_mode
=
_MODE_READ_EOF
self
.
_size
=
self
.
_pos
return
False
# Depending on the input data, our call to the decompressor may not
# return any data. In this case, try again after reading another block.
while
True
:
if
self
.
_buffer
:
return
True
if
self
.
_decompressor
.
unused_data
:
rawblock
=
self
.
_decompressor
.
unused_data
else
:
raise
EOFError
(
"Compressed file ended before the "
"end-of-stream marker was reached"
)
# Continue to next stream.
if
self
.
_decompressor
.
eof
:
self
.
_decompressor
=
LZMADecompressor
(
**
self
.
_init_args
)
rawblock
=
self
.
_fp
.
read
(
_BUFFER_SIZE
)
if
not
rawblock
:
if
self
.
_decompressor
.
eof
:
self
.
_mode
=
_MODE_READ_EOF
self
.
_size
=
self
.
_pos
return
False
else
:
raise
EOFError
(
"Compressed file ended before the "
"end-of-stream marker was reached"
)
# Continue to next stream.
if
self
.
_decompressor
.
eof
:
self
.
_decompressor
=
LZMADecompressor
(
**
self
.
_init_args
)
self
.
_buffer
=
self
.
_decompressor
.
decompress
(
rawblock
)
return
True
self
.
_buffer
=
self
.
_decompressor
.
decompress
(
rawblock
)
# Read data until EOF.
# If return_data is false, consume the data without returning it.
...
...
@@ -284,11 +286,14 @@ class LZMAFile(io.BufferedIOBase):
return
self
.
_read_block
(
size
)
def
read1
(
self
,
size
=-
1
):
"""Read up to size uncompressed bytes
with at most one rea
d
from the underlying stream.
"""Read up to size uncompressed bytes
, while trying to avoi
d
making multiple reads
from the underlying stream.
Returns b"" if the file is at EOF.
"""
# Usually, read1() calls _fp.read() at most once. However, sometimes
# this does not give enough data for the decompressor to make progress.
# In this case we make multiple reads, to avoid returning b"".
self
.
_check_can_read
()
if
(
size
==
0
or
self
.
_mode
==
_MODE_READ_EOF
or
not
self
.
_fill_buffer
()):
...
...
Misc/NEWS
View file @
37d3ff14
...
...
@@ -77,6 +77,9 @@ Core and Builtins
Library
-------
-
Issue
#
15546
:
Fix
handling
of
pathological
input
data
in
the
read1
()
method
of
the
BZ2File
,
GzipFile
and
LZMAFile
classes
.
-
Issue
#
13052
:
Fix
IDLE
crashing
when
replace
string
in
Search
/
Replace
dialog
ended
with
'\'
.
Patch
by
Roger
Serwy
.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment