Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Kirill Smelkov
cpython
Commits
9ed8b4e4
Commit
9ed8b4e4
authored
12 years ago
by
Hynek Schlawack
Browse files
Options
Download
Email Patches
Plain Diff
#10053: Don't close FDs when FileIO.__init__ fails
Loosely based on the work by Hirokazu Yamamoto.
parent
103e8113
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
19 additions
and
6 deletions
+19
-6
Lib/test/test_fileio.py
Lib/test/test_fileio.py
+11
-0
Misc/NEWS
Misc/NEWS
+3
-0
Modules/_io/fileio.c
Modules/_io/fileio.c
+5
-6
No files found.
Lib/test/test_fileio.py
View file @
9ed8b4e4
...
...
@@ -403,6 +403,17 @@ class OtherFileTests(unittest.TestCase):
self
.
assertRaises
(
ValueError
,
_FileIO
,
"/some/invalid/name"
,
"rt"
)
self
.
assertEqual
(
w
.
warnings
,
[])
def
testUnclosedFDOnException
(
self
):
class
MyException
(
Exception
):
pass
class
MyFileIO
(
_FileIO
):
def
__setattr__
(
self
,
name
,
value
):
if
name
==
"name"
:
raise
MyException
(
"blocked setting name"
)
return
super
(
MyFileIO
,
self
).
__setattr__
(
name
,
value
)
fd
=
os
.
open
(
__file__
,
os
.
O_RDONLY
)
self
.
assertRaises
(
MyException
,
MyFileIO
,
fd
)
os
.
close
(
fd
)
# should not raise OSError(EBADF)
def
test_main
():
# Historically, these tests have been sloppy about removing TESTFN.
...
...
This diff is collapsed.
Click to expand it.
Misc/NEWS
View file @
9ed8b4e4
...
...
@@ -10,6 +10,9 @@ What's New in Python 3.2.4
Core and Builtins
-----------------
- Issue #10053: Don't close FDs when FileIO.__init__ fails. Loosely based on
the work by Hirokazu Yamamoto.
- Issue #14775: Fix a potential quadratic dict build-up due to the garbage
collector repeatedly trying to untrack dicts.
...
...
This diff is collapsed.
Click to expand it.
Modules/_io/fileio.c
View file @
9ed8b4e4
...
...
@@ -224,6 +224,7 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
int
flags
=
0
;
int
fd
=
-
1
;
int
closefd
=
1
;
int
fd_is_own
=
0
;
assert
(
PyFileIO_Check
(
oself
));
if
(
self
->
fd
>=
0
)
{
...
...
@@ -362,6 +363,7 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
#endif
self
->
fd
=
open
(
name
,
flags
,
0666
);
Py_END_ALLOW_THREADS
fd_is_own
=
1
;
if
(
self
->
fd
<
0
)
{
#ifdef MS_WINDOWS
if
(
widename
!=
NULL
)
...
...
@@ -388,13 +390,8 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
end of file (otherwise, it might be done only on the
first write()). */
PyObject
*
pos
=
portable_lseek
(
self
->
fd
,
NULL
,
2
);
if
(
pos
==
NULL
)
{
if
(
closefd
)
{
close
(
self
->
fd
);
self
->
fd
=
-
1
;
}
if
(
pos
==
NULL
)
goto
error
;
}
Py_DECREF
(
pos
);
}
...
...
@@ -402,6 +399,8 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
error:
ret
=
-
1
;
if
(
!
fd_is_own
)
self
->
fd
=
-
1
;
if
(
self
->
fd
>=
0
)
internal_close
(
self
);
...
...
This diff is collapsed.
Click to expand it.
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