Merge pull request #3162 from ThomasWaldmann/dont-open-special-1.1

bsdflags support: do not open BLK/CHR/LNK files, fixes #3130
This commit is contained in:
TW 2017-10-14 04:26:37 +02:00 committed by GitHub
commit 7a05b4c960
1 changed files with 9 additions and 2 deletions

View File

@ -72,8 +72,11 @@ BSD_TO_LINUX_FLAGS = {
def set_flags(path, bsd_flags, fd=None):
if fd is None and stat.S_ISLNK(os.lstat(path).st_mode):
return
if fd is None:
st = os.stat(path, follow_symlinks=False)
if stat.S_ISBLK(st.st_mode) or stat.S_ISCHR(st.st_mode) or stat.S_ISLNK(st.st_mode):
# see comment in get_flags()
return
cdef int flags = 0
for bsd_flag, linux_flag in BSD_TO_LINUX_FLAGS.items():
if bsd_flags & bsd_flag:
@ -92,6 +95,10 @@ def set_flags(path, bsd_flags, fd=None):
def get_flags(path, st):
if stat.S_ISBLK(st.st_mode) or stat.S_ISCHR(st.st_mode) or stat.S_ISLNK(st.st_mode):
# avoid opening devices files - trying to open non-present devices can be rather slow.
# avoid opening symlinks, O_NOFOLLOW would make the open() fail anyway.
return 0
cdef int linux_flags
try:
fd = os.open(path, os.O_RDONLY|os.O_NONBLOCK|os.O_NOFOLLOW)