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
0b2dbdca
Commit
0b2dbdca
authored
Feb 21, 2015
by
Serhiy Storchaka
Browse files
Options
Browse Files
Download
Plain Diff
Issue #5700: io.FileIO() called flush() after closing the file.
flush() was not called in close() if closefd=False.
parents
d17c1e69
53e8a96d
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
65 additions
and
9 deletions
+65
-9
Lib/test/test_io.py
Lib/test/test_io.py
+48
-2
Misc/NEWS
Misc/NEWS
+3
-0
Modules/_io/fileio.c
Modules/_io/fileio.c
+14
-7
No files found.
Lib/test/test_io.py
View file @
0b2dbdca
...
...
@@ -589,13 +589,43 @@ class IOTest(unittest.TestCase):
with
self
.
open
(
zero
,
"r"
)
as
f
:
self
.
assertRaises
(
OverflowError
,
f
.
read
)
def
test_flush_error_on_close
(
self
):
f
=
self
.
open
(
support
.
TESTFN
,
"wb"
,
buffering
=
0
)
def
check_flush_error_on_close
(
self
,
*
args
,
**
kwargs
):
# Test that the file is closed despite failed flush
# and that flush() is called before file closed.
f
=
self
.
open
(
*
args
,
**
kwargs
)
closed
=
[]
def
bad_flush
():
closed
[:]
=
[
f
.
closed
]
raise
OSError
()
f
.
flush
=
bad_flush
self
.
assertRaises
(
OSError
,
f
.
close
)
# exception not swallowed
self
.
assertTrue
(
f
.
closed
)
self
.
assertTrue
(
closed
)
# flush() called
self
.
assertFalse
(
closed
[
0
])
# flush() called before file closed
def
test_flush_error_on_close
(
self
):
# raw file
# Issue #5700: io.FileIO calls flush() after file closed
self
.
check_flush_error_on_close
(
support
.
TESTFN
,
'wb'
,
buffering
=
0
)
fd
=
os
.
open
(
support
.
TESTFN
,
os
.
O_WRONLY
|
os
.
O_CREAT
)
self
.
check_flush_error_on_close
(
fd
,
'wb'
,
buffering
=
0
)
fd
=
os
.
open
(
support
.
TESTFN
,
os
.
O_WRONLY
|
os
.
O_CREAT
)
self
.
check_flush_error_on_close
(
fd
,
'wb'
,
buffering
=
0
,
closefd
=
False
)
os
.
close
(
fd
)
# buffered io
self
.
check_flush_error_on_close
(
support
.
TESTFN
,
'wb'
)
fd
=
os
.
open
(
support
.
TESTFN
,
os
.
O_WRONLY
|
os
.
O_CREAT
)
self
.
check_flush_error_on_close
(
fd
,
'wb'
)
fd
=
os
.
open
(
support
.
TESTFN
,
os
.
O_WRONLY
|
os
.
O_CREAT
)
self
.
check_flush_error_on_close
(
fd
,
'wb'
,
closefd
=
False
)
os
.
close
(
fd
)
# text io
self
.
check_flush_error_on_close
(
support
.
TESTFN
,
'w'
)
fd
=
os
.
open
(
support
.
TESTFN
,
os
.
O_WRONLY
|
os
.
O_CREAT
)
self
.
check_flush_error_on_close
(
fd
,
'w'
)
fd
=
os
.
open
(
support
.
TESTFN
,
os
.
O_WRONLY
|
os
.
O_CREAT
)
self
.
check_flush_error_on_close
(
fd
,
'w'
,
closefd
=
False
)
os
.
close
(
fd
)
def
test_multi_close
(
self
):
f
=
self
.
open
(
support
.
TESTFN
,
"wb"
,
buffering
=
0
)
...
...
@@ -784,13 +814,21 @@ class CommonBufferedTests:
self
.
assertEqual
(
repr
(
b
),
"<%s name=b'dummy'>"
%
clsname
)
def
test_flush_error_on_close
(
self
):
# Test that buffered file is closed despite failed flush
# and that flush() is called before file closed.
raw
=
self
.
MockRawIO
()
closed
=
[]
def
bad_flush
():
closed
[:]
=
[
b
.
closed
,
raw
.
closed
]
raise
OSError
()
raw
.
flush
=
bad_flush
b
=
self
.
tp
(
raw
)
self
.
assertRaises
(
OSError
,
b
.
close
)
# exception not swallowed
self
.
assertTrue
(
b
.
closed
)
self
.
assertTrue
(
raw
.
closed
)
self
.
assertTrue
(
closed
)
# flush() called
self
.
assertFalse
(
closed
[
0
])
# flush() called before file closed
self
.
assertFalse
(
closed
[
1
])
def
test_close_error_on_close
(
self
):
raw
=
self
.
MockRawIO
()
...
...
@@ -2679,12 +2717,20 @@ class TextIOWrapperTest(unittest.TestCase):
self
.
assertEqual
(
content
.
count
(
"Thread%03d
\
n
"
%
n
),
1
)
def
test_flush_error_on_close
(
self
):
# Test that text file is closed despite failed flush
# and that flush() is called before file closed.
txt
=
self
.
TextIOWrapper
(
self
.
BytesIO
(
self
.
testdata
),
encoding
=
"ascii"
)
closed
=
[]
def
bad_flush
():
closed
[:]
=
[
txt
.
closed
,
txt
.
buffer
.
closed
]
raise
OSError
()
txt
.
flush
=
bad_flush
self
.
assertRaises
(
OSError
,
txt
.
close
)
# exception not swallowed
self
.
assertTrue
(
txt
.
closed
)
self
.
assertTrue
(
txt
.
buffer
.
closed
)
self
.
assertTrue
(
closed
)
# flush() called
self
.
assertFalse
(
closed
[
0
])
# flush() called before file closed
self
.
assertFalse
(
closed
[
1
])
def
test_close_error_on_close
(
self
):
buffer
=
self
.
BytesIO
(
self
.
testdata
)
...
...
Misc/NEWS
View file @
0b2dbdca
...
...
@@ -13,6 +13,9 @@ Core and Builtins
Library
-------
- Issue #5700: io.FileIO() called flush() after closing the file.
flush() was not called in close() if closefd=False.
- Issue #23374: Fixed pydoc failure with non-ASCII files when stdout encoding
differs from file system encoding (e.g. on Mac OS).
...
...
Modules/_io/fileio.c
View file @
0b2dbdca
...
...
@@ -127,11 +127,18 @@ internal_close(fileio *self)
static
PyObject
*
fileio_close
(
fileio
*
self
)
{
PyObject
*
res
;
PyObject
*
exc
,
*
val
,
*
tb
;
int
rc
;
_Py_IDENTIFIER
(
close
);
res
=
_PyObject_CallMethodId
((
PyObject
*
)
&
PyRawIOBase_Type
,
&
PyId_close
,
"O"
,
self
);
if
(
!
self
->
closefd
)
{
self
->
fd
=
-
1
;
Py_RETURN_NONE
;
return
res
;
}
if
(
res
==
NULL
)
PyErr_Fetch
(
&
exc
,
&
val
,
&
tb
);
if
(
self
->
finalizing
)
{
PyObject
*
r
=
fileio_dealloc_warn
(
self
,
(
PyObject
*
)
self
);
if
(
r
)
...
...
@@ -139,12 +146,12 @@ fileio_close(fileio *self)
else
PyErr_Clear
();
}
errno
=
internal_close
(
self
);
if
(
errno
<
0
)
return
NULL
;
return
_PyObject_CallMethodId
((
PyObject
*
)
&
PyRawIOBase_Type
,
&
PyId_close
,
"O"
,
self
)
;
rc
=
internal_close
(
self
);
if
(
res
==
NULL
)
_PyErr_ChainExceptions
(
exc
,
val
,
tb
)
;
if
(
rc
<
0
)
Py_CLEAR
(
res
);
return
res
;
}
static
PyObject
*
...
...
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