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
216b745e
Commit
216b745e
authored
Aug 27, 2018
by
Przemysław Spodymek
Committed by
Steve Dower
Aug 27, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bpo-33635: Handling Bad file descriptor in Path.is_file and related. (GH-8542)
parent
7ef1697b
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
48 additions
and
10 deletions
+48
-10
Lib/pathlib.py
Lib/pathlib.py
+19
-10
Lib/test/test_pathlib.py
Lib/test/test_pathlib.py
+24
-0
Misc/NEWS.d/next/macOS/2018-07-31-09-51-01.bpo-33635.KiscE-.rst
...EWS.d/next/macOS/2018-07-31-09-51-01.bpo-33635.KiscE-.rst
+5
-0
No files found.
Lib/pathlib.py
View file @
216b745e
...
...
@@ -7,7 +7,7 @@ import posixpath
import
re
import
sys
from
_collections_abc
import
Sequence
from
errno
import
EINVAL
,
ENOENT
,
ENOTDIR
from
errno
import
EINVAL
,
ENOENT
,
ENOTDIR
,
EBADF
from
operator
import
attrgetter
from
stat
import
S_ISDIR
,
S_ISLNK
,
S_ISREG
,
S_ISSOCK
,
S_ISBLK
,
S_ISCHR
,
S_ISFIFO
from
urllib.parse
import
quote_from_bytes
as
urlquote_from_bytes
...
...
@@ -34,6 +34,9 @@ __all__ = [
# Internals
#
# EBADF - guard agains macOS `stat` throwing EBADF
_IGNORED_ERROS
=
(
ENOENT
,
ENOTDIR
,
EBADF
)
def
_is_wildcard_pattern
(
pat
):
# Whether this pattern needs actual matching using fnmatch, or can
# be looked up directly as a file.
...
...
@@ -528,7 +531,13 @@ class _RecursiveWildcardSelector(_Selector):
try
:
entries
=
list
(
scandir
(
parent_path
))
for
entry
in
entries
:
if
entry
.
is_dir
()
and
not
entry
.
is_symlink
():
entry_is_dir
=
False
try
:
entry_is_dir
=
entry
.
is_dir
()
except
OSError
as
e
:
if
e
.
errno
not
in
_IGNORED_ERROS
:
raise
if
entry_is_dir
and
not
entry
.
is_symlink
():
path
=
parent_path
.
_make_child_relpath
(
entry
.
name
)
for
p
in
self
.
_iterate_directories
(
path
,
is_dir
,
scandir
):
yield
p
...
...
@@ -1319,7 +1328,7 @@ class Path(PurePath):
try
:
self
.
stat
()
except
OSError
as
e
:
if
e
.
errno
not
in
(
ENOENT
,
ENOTDIR
)
:
if
e
.
errno
not
in
_IGNORED_ERROS
:
raise
return
False
return
True
...
...
@@ -1331,7 +1340,7 @@ class Path(PurePath):
try
:
return
S_ISDIR
(
self
.
stat
().
st_mode
)
except
OSError
as
e
:
if
e
.
errno
not
in
(
ENOENT
,
ENOTDIR
)
:
if
e
.
errno
not
in
_IGNORED_ERROS
:
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
...
...
@@ -1345,7 +1354,7 @@ class Path(PurePath):
try
:
return
S_ISREG
(
self
.
stat
().
st_mode
)
except
OSError
as
e
:
if
e
.
errno
not
in
(
ENOENT
,
ENOTDIR
)
:
if
e
.
errno
not
in
_IGNORED_ERROS
:
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
...
...
@@ -1379,7 +1388,7 @@ class Path(PurePath):
try
:
return
S_ISLNK
(
self
.
lstat
().
st_mode
)
except
OSError
as
e
:
if
e
.
errno
not
in
(
ENOENT
,
ENOTDIR
)
:
if
e
.
errno
not
in
_IGNORED_ERROS
:
raise
# Path doesn't exist
return
False
...
...
@@ -1391,7 +1400,7 @@ class Path(PurePath):
try
:
return
S_ISBLK
(
self
.
stat
().
st_mode
)
except
OSError
as
e
:
if
e
.
errno
not
in
(
ENOENT
,
ENOTDIR
)
:
if
e
.
errno
not
in
_IGNORED_ERROS
:
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
...
...
@@ -1404,7 +1413,7 @@ class Path(PurePath):
try
:
return
S_ISCHR
(
self
.
stat
().
st_mode
)
except
OSError
as
e
:
if
e
.
errno
not
in
(
ENOENT
,
ENOTDIR
)
:
if
e
.
errno
not
in
_IGNORED_ERROS
:
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
...
...
@@ -1417,7 +1426,7 @@ class Path(PurePath):
try
:
return
S_ISFIFO
(
self
.
stat
().
st_mode
)
except
OSError
as
e
:
if
e
.
errno
not
in
(
ENOENT
,
ENOTDIR
)
:
if
e
.
errno
not
in
_IGNORED_ERROS
:
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
...
...
@@ -1430,7 +1439,7 @@ class Path(PurePath):
try
:
return
S_ISSOCK
(
self
.
stat
().
st_mode
)
except
OSError
as
e
:
if
e
.
errno
not
in
(
ENOENT
,
ENOTDIR
)
:
if
e
.
errno
not
in
_IGNORED_ERROS
:
raise
# Path doesn't exist or is a broken symlink
# (see https://bitbucket.org/pitrou/pathlib/issue/12/)
...
...
Lib/test/test_pathlib.py
View file @
216b745e
import
collections.abc
import
io
import
os
import
sys
import
errno
import
pathlib
import
pickle
...
...
@@ -2176,6 +2177,29 @@ class PosixPathTest(_BasePathTest, unittest.TestCase):
self
.
assertEqual
(
p6
.
expanduser
(),
p6
)
self
.
assertRaises
(
RuntimeError
,
p7
.
expanduser
)
@
unittest
.
skipIf
(
sys
.
platform
!=
"darwin"
,
"Bad file descriptor in /dev/fd affects only macOS"
)
def
test_handling_bad_descriptor
(
self
):
try
:
file_descriptors
=
list
(
pathlib
.
Path
(
'/dev/fd'
).
rglob
(
"*"
))[
3
:]
if
not
file_descriptors
:
self
.
skipTest
(
"no file descriptors - issue was not reproduced"
)
# Checking all file descriptors because there is no guarantee
# which one will fail.
for
f
in
file_descriptors
:
f
.
exists
()
f
.
is_dir
()
f
.
is_file
()
f
.
is_symlink
()
f
.
is_block_device
()
f
.
is_char_device
()
f
.
is_fifo
()
f
.
is_socket
()
except
OSError
as
e
:
if
e
.
errno
==
errno
.
EBADF
:
self
.
fail
(
"Bad file descriptor not handled."
)
raise
@
only_nt
class
WindowsPathTest
(
_BasePathTest
,
unittest
.
TestCase
):
...
...
Misc/NEWS.d/next/macOS/2018-07-31-09-51-01.bpo-33635.KiscE-.rst
0 → 100644
View file @
216b745e
In macOS stat on some file descriptors (/dev/fd/3 f.e) will result in bad
file descriptor OSError. Guard against this exception was added in is_dir,
is_file and similar methods. DirEntry.is_dir can also throw this exception
so _RecursiveWildcardSelector._iterate_directories was also extended with
the same error ignoring pattern.
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