bsdflags support: do not open BLK/CHR/LNK files, fixes #3130

opening a device file for a non-existing device can be very slow.
symlinks will make the open() call fail as it is using O_NOFOLLOW.

also: lstat -> stat(..., follow_symlinks=False) like everywhere else.
(cherry picked from commit a6ee4e9aed)
This commit is contained in:
Thomas Waldmann 2017-10-11 03:32:33 +02:00
parent 58c53e25ea
commit e1723ec1d9
1 changed files with 9 additions and 2 deletions

View File

@ -72,7 +72,10 @@ 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):
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():
@ -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)